/FileExtraction/Java_unseen/Kegbot_kegbot-android/kegtab/src/main/java/org/kegbot/proto/Models.java
// Generated by the protocol buffer compiler.  DO NOT EDIT!
// source: models.proto

package org.kegbot.proto;

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

  public static void registerAllExtensions(
      com.google.protobuf.ExtensionRegistry registry) {
    registerAllExtensions(
        (com.google.protobuf.ExtensionRegistryLite) registry);
  }
  public interface AuthenticationTokenOrBuilder extends
      // @@protoc_insertion_point(interface_extends:AuthenticationToken)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <pre>
     * The unique identifier for this token.
     * </pre>
     *
     * <code>required uint32 id = 1;</code>
     * @return Whether the id field is set.
     */
    boolean hasId();
    /**
     * <pre>
     * The unique identifier for this token.
     * </pre>
     *
     * <code>required uint32 id = 1;</code>
     * @return The id.
     */
    int getId();

    /**
     * <pre>
     * The name of the auth device that owns this token, such as ``core.onewire``
     * or ``contrib.phidget.rfid``.
     * </pre>
     *
     * <code>required string auth_device = 2;</code>
     * @return Whether the authDevice field is set.
     */
    boolean hasAuthDevice();
    /**
     * <pre>
     * The name of the auth device that owns this token, such as ``core.onewire``
     * or ``contrib.phidget.rfid``.
     * </pre>
     *
     * <code>required string auth_device = 2;</code>
     * @return The authDevice.
     */
    java.lang.String getAuthDevice();
    /**
     * <pre>
     * The name of the auth device that owns this token, such as ``core.onewire``
     * or ``contrib.phidget.rfid``.
     * </pre>
     *
     * <code>required string auth_device = 2;</code>
     * @return The bytes for authDevice.
     */
    com.google.protobuf.ByteString
        getAuthDeviceBytes();

    /**
     * <pre>
     * The unique key.
     * </pre>
     *
     * <code>required string token_value = 3;</code>
     * @return Whether the tokenValue field is set.
     */
    boolean hasTokenValue();
    /**
     * <pre>
     * The unique key.
     * </pre>
     *
     * <code>required string token_value = 3;</code>
     * @return The tokenValue.
     */
    java.lang.String getTokenValue();
    /**
     * <pre>
     * The unique key.
     * </pre>
     *
     * <code>required string token_value = 3;</code>
     * @return The bytes for tokenValue.
     */
    com.google.protobuf.ByteString
        getTokenValueBytes();

    /**
     * <pre>
     * The user owning the token.
     * </pre>
     *
     * <code>optional string username = 4;</code>
     * @return Whether the username field is set.
     */
    boolean hasUsername();
    /**
     * <pre>
     * The user owning the token.
     * </pre>
     *
     * <code>optional string username = 4;</code>
     * @return The username.
     */
    java.lang.String getUsername();
    /**
     * <pre>
     * The user owning the token.
     * </pre>
     *
     * <code>optional string username = 4;</code>
     * @return The bytes for username.
     */
    com.google.protobuf.ByteString
        getUsernameBytes();

    /**
     * <pre>
     * An optional human-readable name for this token.
     * </pre>
     *
     * <code>optional string nice_name = 5;</code>
     * @return Whether the niceName field is set.
     */
    boolean hasNiceName();
    /**
     * <pre>
     * An optional human-readable name for this token.
     * </pre>
     *
     * <code>optional string nice_name = 5;</code>
     * @return The niceName.
     */
    java.lang.String getNiceName();
    /**
     * <pre>
     * An optional human-readable name for this token.
     * </pre>
     *
     * <code>optional string nice_name = 5;</code>
     * @return The bytes for niceName.
     */
    com.google.protobuf.ByteString
        getNiceNameBytes();

    /**
     * <pre>
     * True if the token is enabled.
     * </pre>
     *
     * <code>optional bool enabled = 6;</code>
     * @return Whether the enabled field is set.
     */
    boolean hasEnabled();
    /**
     * <pre>
     * True if the token is enabled.
     * </pre>
     *
     * <code>optional bool enabled = 6;</code>
     * @return The enabled.
     */
    boolean getEnabled();

    /**
     * <pre>
     * The date the token was created, as an ISO8061 UTC timestamp.
     * </pre>
     *
     * <code>required string created_time = 7;</code>
     * @return Whether the createdTime field is set.
     */
    boolean hasCreatedTime();
    /**
     * <pre>
     * The date the token was created, as an ISO8061 UTC timestamp.
     * </pre>
     *
     * <code>required string created_time = 7;</code>
     * @return The createdTime.
     */
    java.lang.String getCreatedTime();
    /**
     * <pre>
     * The date the token was created, as an ISO8061 UTC timestamp.
     * </pre>
     *
     * <code>required string created_time = 7;</code>
     * @return The bytes for createdTime.
     */
    com.google.protobuf.ByteString
        getCreatedTimeBytes();

    /**
     * <pre>
     * The date after which the token is invalid, as an ISO8061 UTC timestamp.
     * Only available to admin users.
     * </pre>
     *
     * <code>optional string expire_time = 8;</code>
     * @return Whether the expireTime field is set.
     */
    boolean hasExpireTime();
    /**
     * <pre>
     * The date after which the token is invalid, as an ISO8061 UTC timestamp.
     * Only available to admin users.
     * </pre>
     *
     * <code>optional string expire_time = 8;</code>
     * @return The expireTime.
     */
    java.lang.String getExpireTime();
    /**
     * <pre>
     * The date after which the token is invalid, as an ISO8061 UTC timestamp.
     * Only available to admin users.
     * </pre>
     *
     * <code>optional string expire_time = 8;</code>
     * @return The bytes for expireTime.
     */
    com.google.protobuf.ByteString
        getExpireTimeBytes();

    /**
     * <pre>
     * The token's pin, if any.
     * Only available to admin users.
     * </pre>
     *
     * <code>optional string pin = 9;</code>
     * @return Whether the pin field is set.
     */
    boolean hasPin();
    /**
     * <pre>
     * The token's pin, if any.
     * Only available to admin users.
     * </pre>
     *
     * <code>optional string pin = 9;</code>
     * @return The pin.
     */
    java.lang.String getPin();
    /**
     * <pre>
     * The token's pin, if any.
     * Only available to admin users.
     * </pre>
     *
     * <code>optional string pin = 9;</code>
     * @return The bytes for pin.
     */
    com.google.protobuf.ByteString
        getPinBytes();

    /**
     * <code>optional .User user = 10;</code>
     * @return Whether the user field is set.
     */
    boolean hasUser();
    /**
     * <code>optional .User user = 10;</code>
     * @return The user.
     */
    org.kegbot.proto.Models.User getUser();
    /**
     * <code>optional .User user = 10;</code>
     */
    org.kegbot.proto.Models.UserOrBuilder getUserOrBuilder();
  }
  /**
   * <pre>
   * An authentication token, which a drinker uses to authenticate to the system.
   * </pre>
   *
   * Protobuf type {@code AuthenticationToken}
   */
  public static final class AuthenticationToken extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:AuthenticationToken)
      AuthenticationTokenOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use AuthenticationToken.newBuilder() to construct.
    private AuthenticationToken(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private AuthenticationToken() {
      authDevice_ = "";
      tokenValue_ = "";
      username_ = "";
      niceName_ = "";
      createdTime_ = "";
      expireTime_ = "";
      pin_ = "";
    }

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

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return org.kegbot.proto.Models.internal_static_AuthenticationToken_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return org.kegbot.proto.Models.internal_static_AuthenticationToken_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              org.kegbot.proto.Models.AuthenticationToken.class, org.kegbot.proto.Models.AuthenticationToken.Builder.class);
    }

    private int bitField0_;
    public static final int ID_FIELD_NUMBER = 1;
    private int id_;
    /**
     * <pre>
     * The unique identifier for this token.
     * </pre>
     *
     * <code>required uint32 id = 1;</code>
     * @return Whether the id field is set.
     */
    @java.lang.Override
    public boolean hasId() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <pre>
     * The unique identifier for this token.
     * </pre>
     *
     * <code>required uint32 id = 1;</code>
     * @return The id.
     */
    @java.lang.Override
    public int getId() {
      return id_;
    }

    public static final int AUTH_DEVICE_FIELD_NUMBER = 2;
    private volatile java.lang.Object authDevice_;
    /**
     * <pre>
     * The name of the auth device that owns this token, such as ``core.onewire``
     * or ``contrib.phidget.rfid``.
     * </pre>
     *
     * <code>required string auth_device = 2;</code>
     * @return Whether the authDevice field is set.
     */
    @java.lang.Override
    public boolean hasAuthDevice() {
      return ((bitField0_ & 0x00000002) != 0);
    }
    /**
     * <pre>
     * The name of the auth device that owns this token, such as ``core.onewire``
     * or ``contrib.phidget.rfid``.
     * </pre>
     *
     * <code>required string auth_device = 2;</code>
     * @return The authDevice.
     */
    @java.lang.Override
    public java.lang.String getAuthDevice() {
      java.lang.Object ref = authDevice_;
      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()) {
          authDevice_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * The name of the auth device that owns this token, such as ``core.onewire``
     * or ``contrib.phidget.rfid``.
     * </pre>
     *
     * <code>required string auth_device = 2;</code>
     * @return The bytes for authDevice.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getAuthDeviceBytes() {
      java.lang.Object ref = authDevice_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        authDevice_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int TOKEN_VALUE_FIELD_NUMBER = 3;
    private volatile java.lang.Object tokenValue_;
    /**
     * <pre>
     * The unique key.
     * </pre>
     *
     * <code>required string token_value = 3;</code>
     * @return Whether the tokenValue field is set.
     */
    @java.lang.Override
    public boolean hasTokenValue() {
      return ((bitField0_ & 0x00000004) != 0);
    }
    /**
     * <pre>
     * The unique key.
     * </pre>
     *
     * <code>required string token_value = 3;</code>
     * @return The tokenValue.
     */
    @java.lang.Override
    public java.lang.String getTokenValue() {
      java.lang.Object ref = tokenValue_;
      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()) {
          tokenValue_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * The unique key.
     * </pre>
     *
     * <code>required string token_value = 3;</code>
     * @return The bytes for tokenValue.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getTokenValueBytes() {
      java.lang.Object ref = tokenValue_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        tokenValue_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int USERNAME_FIELD_NUMBER = 4;
    private volatile java.lang.Object username_;
    /**
     * <pre>
     * The user owning the token.
     * </pre>
     *
     * <code>optional string username = 4;</code>
     * @return Whether the username field is set.
     */
    @java.lang.Override
    public boolean hasUsername() {
      return ((bitField0_ & 0x00000008) != 0);
    }
    /**
     * <pre>
     * The user owning the token.
     * </pre>
     *
     * <code>optional string username = 4;</code>
     * @return The username.
     */
    @java.lang.Override
    public java.lang.String getUsername() {
      java.lang.Object ref = username_;
      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()) {
          username_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * The user owning the token.
     * </pre>
     *
     * <code>optional string username = 4;</code>
     * @return The bytes for username.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getUsernameBytes() {
      java.lang.Object ref = username_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        username_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int NICE_NAME_FIELD_NUMBER = 5;
    private volatile java.lang.Object niceName_;
    /**
     * <pre>
     * An optional human-readable name for this token.
     * </pre>
     *
     * <code>optional string nice_name = 5;</code>
     * @return Whether the niceName field is set.
     */
    @java.lang.Override
    public boolean hasNiceName() {
      return ((bitField0_ & 0x00000010) != 0);
    }
    /**
     * <pre>
     * An optional human-readable name for this token.
     * </pre>
     *
     * <code>optional string nice_name = 5;</code>
     * @return The niceName.
     */
    @java.lang.Override
    public java.lang.String getNiceName() {
      java.lang.Object ref = niceName_;
      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()) {
          niceName_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * An optional human-readable name for this token.
     * </pre>
     *
     * <code>optional string nice_name = 5;</code>
     * @return The bytes for niceName.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getNiceNameBytes() {
      java.lang.Object ref = niceName_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        niceName_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int ENABLED_FIELD_NUMBER = 6;
    private boolean enabled_;
    /**
     * <pre>
     * True if the token is enabled.
     * </pre>
     *
     * <code>optional bool enabled = 6;</code>
     * @return Whether the enabled field is set.
     */
    @java.lang.Override
    public boolean hasEnabled() {
      return ((bitField0_ & 0x00000020) != 0);
    }
    /**
     * <pre>
     * True if the token is enabled.
     * </pre>
     *
     * <code>optional bool enabled = 6;</code>
     * @return The enabled.
     */
    @java.lang.Override
    public boolean getEnabled() {
      return enabled_;
    }

    public static final int CREATED_TIME_FIELD_NUMBER = 7;
    private volatile java.lang.Object createdTime_;
    /**
     * <pre>
     * The date the token was created, as an ISO8061 UTC timestamp.
     * </pre>
     *
     * <code>required string created_time = 7;</code>
     * @return Whether the createdTime field is set.
     */
    @java.lang.Override
    public boolean hasCreatedTime() {
      return ((bitField0_ & 0x00000040) != 0);
    }
    /**
     * <pre>
     * The date the token was created, as an ISO8061 UTC timestamp.
     * </pre>
     *
     * <code>required string created_time = 7;</code>
     * @return The createdTime.
     */
    @java.lang.Override
    public java.lang.String getCreatedTime() {
      java.lang.Object ref = createdTime_;
      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()) {
          createdTime_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * The date the token was created, as an ISO8061 UTC timestamp.
     * </pre>
     *
     * <code>required string created_time = 7;</code>
     * @return The bytes for createdTime.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getCreatedTimeBytes() {
      java.lang.Object ref = createdTime_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        createdTime_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int EXPIRE_TIME_FIELD_NUMBER = 8;
    private volatile java.lang.Object expireTime_;
    /**
     * <pre>
     * The date after which the token is invalid, as an ISO8061 UTC timestamp.
     * Only available to admin users.
     * </pre>
     *
     * <code>optional string expire_time = 8;</code>
     * @return Whether the expireTime field is set.
     */
    @java.lang.Override
    public boolean hasExpireTime() {
      return ((bitField0_ & 0x00000080) != 0);
    }
    /**
     * <pre>
     * The date after which the token is invalid, as an ISO8061 UTC timestamp.
     * Only available to admin users.
     * </pre>
     *
     * <code>optional string expire_time = 8;</code>
     * @return The expireTime.
     */
    @java.lang.Override
    public java.lang.String getExpireTime() {
      java.lang.Object ref = expireTime_;
      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()) {
          expireTime_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * The date after which the token is invalid, as an ISO8061 UTC timestamp.
     * Only available to admin users.
     * </pre>
     *
     * <code>optional string expire_time = 8;</code>
     * @return The bytes for expireTime.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getExpireTimeBytes() {
      java.lang.Object ref = expireTime_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        expireTime_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int PIN_FIELD_NUMBER = 9;
    private volatile java.lang.Object pin_;
    /**
     * <pre>
     * The token's pin, if any.
     * Only available to admin users.
     * </pre>
     *
     * <code>optional string pin = 9;</code>
     * @return Whether the pin field is set.
     */
    @java.lang.Override
    public boolean hasPin() {
      return ((bitField0_ & 0x00000100) != 0);
    }
    /**
     * <pre>
     * The token's pin, if any.
     * Only available to admin users.
     * </pre>
     *
     * <code>optional string pin = 9;</code>
     * @return The pin.
     */
    @java.lang.Override
    public java.lang.String getPin() {
      java.lang.Object ref = pin_;
      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()) {
          pin_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * The token's pin, if any.
     * Only available to admin users.
     * </pre>
     *
     * <code>optional string pin = 9;</code>
     * @return The bytes for pin.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getPinBytes() {
      java.lang.Object ref = pin_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        pin_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int USER_FIELD_NUMBER = 10;
    private org.kegbot.proto.Models.User user_;
    /**
     * <code>optional .User user = 10;</code>
     * @return Whether the user field is set.
     */
    @java.lang.Override
    public boolean hasUser() {
      return ((bitField0_ & 0x00000200) != 0);
    }
    /**
     * <code>optional .User user = 10;</code>
     * @return The user.
     */
    @java.lang.Override
    public org.kegbot.proto.Models.User getUser() {
      return user_ == null ? org.kegbot.proto.Models.User.getDefaultInstance() : user_;
    }
    /**
     * <code>optional .User user = 10;</code>
     */
    @java.lang.Override
    public org.kegbot.proto.Models.UserOrBuilder getUserOrBuilder() {
      return user_ == null ? org.kegbot.proto.Models.User.getDefaultInstance() : user_;
    }

    public static org.kegbot.proto.Models.AuthenticationToken parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.AuthenticationToken parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.AuthenticationToken parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.AuthenticationToken parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.AuthenticationToken parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.AuthenticationToken parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.AuthenticationToken parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.AuthenticationToken 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 org.kegbot.proto.Models.AuthenticationToken parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.AuthenticationToken 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 org.kegbot.proto.Models.AuthenticationToken parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.AuthenticationToken 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(org.kegbot.proto.Models.AuthenticationToken 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>
     * An authentication token, which a drinker uses to authenticate to the system.
     * </pre>
     *
     * Protobuf type {@code AuthenticationToken}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:AuthenticationToken)
        org.kegbot.proto.Models.AuthenticationTokenOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return org.kegbot.proto.Models.internal_static_AuthenticationToken_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return org.kegbot.proto.Models.internal_static_AuthenticationToken_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                org.kegbot.proto.Models.AuthenticationToken.class, org.kegbot.proto.Models.AuthenticationToken.Builder.class);
      }

      // Construct using org.kegbot.proto.Models.AuthenticationToken.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
          getUserFieldBuilder();
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        id_ = 0;
        bitField0_ = (bitField0_ & ~0x00000001);
        authDevice_ = "";
        bitField0_ = (bitField0_ & ~0x00000002);
        tokenValue_ = "";
        bitField0_ = (bitField0_ & ~0x00000004);
        username_ = "";
        bitField0_ = (bitField0_ & ~0x00000008);
        niceName_ = "";
        bitField0_ = (bitField0_ & ~0x00000010);
        enabled_ = false;
        bitField0_ = (bitField0_ & ~0x00000020);
        createdTime_ = "";
        bitField0_ = (bitField0_ & ~0x00000040);
        expireTime_ = "";
        bitField0_ = (bitField0_ & ~0x00000080);
        pin_ = "";
        bitField0_ = (bitField0_ & ~0x00000100);
        if (userBuilder_ == null) {
          user_ = null;
        } else {
          userBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000200);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return org.kegbot.proto.Models.internal_static_AuthenticationToken_descriptor;
      }

      @java.lang.Override
      public org.kegbot.proto.Models.AuthenticationToken getDefaultInstanceForType() {
        return org.kegbot.proto.Models.AuthenticationToken.getDefaultInstance();
      }

      @java.lang.Override
      public org.kegbot.proto.Models.AuthenticationToken build() {
        org.kegbot.proto.Models.AuthenticationToken result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public org.kegbot.proto.Models.AuthenticationToken buildPartial() {
        org.kegbot.proto.Models.AuthenticationToken result = new org.kegbot.proto.Models.AuthenticationToken(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)) {
          to_bitField0_ |= 0x00000002;
        }
        result.authDevice_ = authDevice_;
        if (((from_bitField0_ & 0x00000004) != 0)) {
          to_bitField0_ |= 0x00000004;
        }
        result.tokenValue_ = tokenValue_;
        if (((from_bitField0_ & 0x00000008) != 0)) {
          to_bitField0_ |= 0x00000008;
        }
        result.username_ = username_;
        if (((from_bitField0_ & 0x00000010) != 0)) {
          to_bitField0_ |= 0x00000010;
        }
        result.niceName_ = niceName_;
        if (((from_bitField0_ & 0x00000020) != 0)) {
          result.enabled_ = enabled_;
          to_bitField0_ |= 0x00000020;
        }
        if (((from_bitField0_ & 0x00000040) != 0)) {
          to_bitField0_ |= 0x00000040;
        }
        result.createdTime_ = createdTime_;
        if (((from_bitField0_ & 0x00000080) != 0)) {
          to_bitField0_ |= 0x00000080;
        }
        result.expireTime_ = expireTime_;
        if (((from_bitField0_ & 0x00000100) != 0)) {
          to_bitField0_ |= 0x00000100;
        }
        result.pin_ = pin_;
        if (((from_bitField0_ & 0x00000200) != 0)) {
          if (userBuilder_ == null) {
            result.user_ = user_;
          } else {
            result.user_ = userBuilder_.build();
          }
          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);
      }
      private int bitField0_;

      private int id_ ;
      /**
       * <pre>
       * The unique identifier for this token.
       * </pre>
       *
       * <code>required uint32 id = 1;</code>
       * @return Whether the id field is set.
       */
      @java.lang.Override
      public boolean hasId() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <pre>
       * The unique identifier for this token.
       * </pre>
       *
       * <code>required uint32 id = 1;</code>
       * @return The id.
       */
      @java.lang.Override
      public int getId() {
        return id_;
      }
      /**
       * <pre>
       * The unique identifier for this token.
       * </pre>
       *
       * <code>required uint32 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>
       * The unique identifier for this token.
       * </pre>
       *
       * <code>required uint32 id = 1;</code>
       * @return This builder for chaining.
       */
      public Builder clearId() {
        bitField0_ = (bitField0_ & ~0x00000001);
        id_ = 0;
        onChanged();
        return this;
      }

      private java.lang.Object authDevice_ = "";
      /**
       * <pre>
       * The name of the auth device that owns this token, such as ``core.onewire``
       * or ``contrib.phidget.rfid``.
       * </pre>
       *
       * <code>required string auth_device = 2;</code>
       * @return Whether the authDevice field is set.
       */
      public boolean hasAuthDevice() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <pre>
       * The name of the auth device that owns this token, such as ``core.onewire``
       * or ``contrib.phidget.rfid``.
       * </pre>
       *
       * <code>required string auth_device = 2;</code>
       * @return The authDevice.
       */
      public java.lang.String getAuthDevice() {
        java.lang.Object ref = authDevice_;
        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()) {
            authDevice_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * The name of the auth device that owns this token, such as ``core.onewire``
       * or ``contrib.phidget.rfid``.
       * </pre>
       *
       * <code>required string auth_device = 2;</code>
       * @return The bytes for authDevice.
       */
      public com.google.protobuf.ByteString
          getAuthDeviceBytes() {
        java.lang.Object ref = authDevice_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          authDevice_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * The name of the auth device that owns this token, such as ``core.onewire``
       * or ``contrib.phidget.rfid``.
       * </pre>
       *
       * <code>required string auth_device = 2;</code>
       * @param value The authDevice to set.
       * @return This builder for chaining.
       */
      public Builder setAuthDevice(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
        authDevice_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The name of the auth device that owns this token, such as ``core.onewire``
       * or ``contrib.phidget.rfid``.
       * </pre>
       *
       * <code>required string auth_device = 2;</code>
       * @return This builder for chaining.
       */
      public Builder clearAuthDevice() {
        bitField0_ = (bitField0_ & ~0x00000002);
        authDevice_ = getDefaultInstance().getAuthDevice();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The name of the auth device that owns this token, such as ``core.onewire``
       * or ``contrib.phidget.rfid``.
       * </pre>
       *
       * <code>required string auth_device = 2;</code>
       * @param value The bytes for authDevice to set.
       * @return This builder for chaining.
       */
      public Builder setAuthDeviceBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
        authDevice_ = value;
        onChanged();
        return this;
      }

      private java.lang.Object tokenValue_ = "";
      /**
       * <pre>
       * The unique key.
       * </pre>
       *
       * <code>required string token_value = 3;</code>
       * @return Whether the tokenValue field is set.
       */
      public boolean hasTokenValue() {
        return ((bitField0_ & 0x00000004) != 0);
      }
      /**
       * <pre>
       * The unique key.
       * </pre>
       *
       * <code>required string token_value = 3;</code>
       * @return The tokenValue.
       */
      public java.lang.String getTokenValue() {
        java.lang.Object ref = tokenValue_;
        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()) {
            tokenValue_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * The unique key.
       * </pre>
       *
       * <code>required string token_value = 3;</code>
       * @return The bytes for tokenValue.
       */
      public com.google.protobuf.ByteString
          getTokenValueBytes() {
        java.lang.Object ref = tokenValue_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          tokenValue_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * The unique key.
       * </pre>
       *
       * <code>required string token_value = 3;</code>
       * @param value The tokenValue to set.
       * @return This builder for chaining.
       */
      public Builder setTokenValue(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
        tokenValue_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The unique key.
       * </pre>
       *
       * <code>required string token_value = 3;</code>
       * @return This builder for chaining.
       */
      public Builder clearTokenValue() {
        bitField0_ = (bitField0_ & ~0x00000004);
        tokenValue_ = getDefaultInstance().getTokenValue();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The unique key.
       * </pre>
       *
       * <code>required string token_value = 3;</code>
       * @param value The bytes for tokenValue to set.
       * @return This builder for chaining.
       */
      public Builder setTokenValueBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
        tokenValue_ = value;
        onChanged();
        return this;
      }

      private java.lang.Object username_ = "";
      /**
       * <pre>
       * The user owning the token.
       * </pre>
       *
       * <code>optional string username = 4;</code>
       * @return Whether the username field is set.
       */
      public boolean hasUsername() {
        return ((bitField0_ & 0x00000008) != 0);
      }
      /**
       * <pre>
       * The user owning the token.
       * </pre>
       *
       * <code>optional string username = 4;</code>
       * @return The username.
       */
      public java.lang.String getUsername() {
        java.lang.Object ref = username_;
        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()) {
            username_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * The user owning the token.
       * </pre>
       *
       * <code>optional string username = 4;</code>
       * @return The bytes for username.
       */
      public com.google.protobuf.ByteString
          getUsernameBytes() {
        java.lang.Object ref = username_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          username_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * The user owning the token.
       * </pre>
       *
       * <code>optional string username = 4;</code>
       * @param value The username to set.
       * @return This builder for chaining.
       */
      public Builder setUsername(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
        username_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The user owning the token.
       * </pre>
       *
       * <code>optional string username = 4;</code>
       * @return This builder for chaining.
       */
      public Builder clearUsername() {
        bitField0_ = (bitField0_ & ~0x00000008);
        username_ = getDefaultInstance().getUsername();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The user owning the token.
       * </pre>
       *
       * <code>optional string username = 4;</code>
       * @param value The bytes for username to set.
       * @return This builder for chaining.
       */
      public Builder setUsernameBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
        username_ = value;
        onChanged();
        return this;
      }

      private java.lang.Object niceName_ = "";
      /**
       * <pre>
       * An optional human-readable name for this token.
       * </pre>
       *
       * <code>optional string nice_name = 5;</code>
       * @return Whether the niceName field is set.
       */
      public boolean hasNiceName() {
        return ((bitField0_ & 0x00000010) != 0);
      }
      /**
       * <pre>
       * An optional human-readable name for this token.
       * </pre>
       *
       * <code>optional string nice_name = 5;</code>
       * @return The niceName.
       */
      public java.lang.String getNiceName() {
        java.lang.Object ref = niceName_;
        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()) {
            niceName_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * An optional human-readable name for this token.
       * </pre>
       *
       * <code>optional string nice_name = 5;</code>
       * @return The bytes for niceName.
       */
      public com.google.protobuf.ByteString
          getNiceNameBytes() {
        java.lang.Object ref = niceName_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          niceName_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * An optional human-readable name for this token.
       * </pre>
       *
       * <code>optional string nice_name = 5;</code>
       * @param value The niceName to set.
       * @return This builder for chaining.
       */
      public Builder setNiceName(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
        niceName_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * An optional human-readable name for this token.
       * </pre>
       *
       * <code>optional string nice_name = 5;</code>
       * @return This builder for chaining.
       */
      public Builder clearNiceName() {
        bitField0_ = (bitField0_ & ~0x00000010);
        niceName_ = getDefaultInstance().getNiceName();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * An optional human-readable name for this token.
       * </pre>
       *
       * <code>optional string nice_name = 5;</code>
       * @param value The bytes for niceName to set.
       * @return This builder for chaining.
       */
      public Builder setNiceNameBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
        niceName_ = value;
        onChanged();
        return this;
      }

      private boolean enabled_ ;
      /**
       * <pre>
       * True if the token is enabled.
       * </pre>
       *
       * <code>optional bool enabled = 6;</code>
       * @return Whether the enabled field is set.
       */
      @java.lang.Override
      public boolean hasEnabled() {
        return ((bitField0_ & 0x00000020) != 0);
      }
      /**
       * <pre>
       * True if the token is enabled.
       * </pre>
       *
       * <code>optional bool enabled = 6;</code>
       * @return The enabled.
       */
      @java.lang.Override
      public boolean getEnabled() {
        return enabled_;
      }
      /**
       * <pre>
       * True if the token is enabled.
       * </pre>
       *
       * <code>optional bool enabled = 6;</code>
       * @param value The enabled to set.
       * @return This builder for chaining.
       */
      public Builder setEnabled(boolean value) {
        bitField0_ |= 0x00000020;
        enabled_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * True if the token is enabled.
       * </pre>
       *
       * <code>optional bool enabled = 6;</code>
       * @return This builder for chaining.
       */
      public Builder clearEnabled() {
        bitField0_ = (bitField0_ & ~0x00000020);
        enabled_ = false;
        onChanged();
        return this;
      }

      private java.lang.Object createdTime_ = "";
      /**
       * <pre>
       * The date the token was created, as an ISO8061 UTC timestamp.
       * </pre>
       *
       * <code>required string created_time = 7;</code>
       * @return Whether the createdTime field is set.
       */
      public boolean hasCreatedTime() {
        return ((bitField0_ & 0x00000040) != 0);
      }
      /**
       * <pre>
       * The date the token was created, as an ISO8061 UTC timestamp.
       * </pre>
       *
       * <code>required string created_time = 7;</code>
       * @return The createdTime.
       */
      public java.lang.String getCreatedTime() {
        java.lang.Object ref = createdTime_;
        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()) {
            createdTime_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * The date the token was created, as an ISO8061 UTC timestamp.
       * </pre>
       *
       * <code>required string created_time = 7;</code>
       * @return The bytes for createdTime.
       */
      public com.google.protobuf.ByteString
          getCreatedTimeBytes() {
        java.lang.Object ref = createdTime_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          createdTime_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * The date the token was created, as an ISO8061 UTC timestamp.
       * </pre>
       *
       * <code>required string created_time = 7;</code>
       * @param value The createdTime to set.
       * @return This builder for chaining.
       */
      public Builder setCreatedTime(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000040;
        createdTime_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The date the token was created, as an ISO8061 UTC timestamp.
       * </pre>
       *
       * <code>required string created_time = 7;</code>
       * @return This builder for chaining.
       */
      public Builder clearCreatedTime() {
        bitField0_ = (bitField0_ & ~0x00000040);
        createdTime_ = getDefaultInstance().getCreatedTime();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The date the token was created, as an ISO8061 UTC timestamp.
       * </pre>
       *
       * <code>required string created_time = 7;</code>
       * @param value The bytes for createdTime to set.
       * @return This builder for chaining.
       */
      public Builder setCreatedTimeBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000040;
        createdTime_ = value;
        onChanged();
        return this;
      }

      private java.lang.Object expireTime_ = "";
      /**
       * <pre>
       * The date after which the token is invalid, as an ISO8061 UTC timestamp.
       * Only available to admin users.
       * </pre>
       *
       * <code>optional string expire_time = 8;</code>
       * @return Whether the expireTime field is set.
       */
      public boolean hasExpireTime() {
        return ((bitField0_ & 0x00000080) != 0);
      }
      /**
       * <pre>
       * The date after which the token is invalid, as an ISO8061 UTC timestamp.
       * Only available to admin users.
       * </pre>
       *
       * <code>optional string expire_time = 8;</code>
       * @return The expireTime.
       */
      public java.lang.String getExpireTime() {
        java.lang.Object ref = expireTime_;
        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()) {
            expireTime_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * The date after which the token is invalid, as an ISO8061 UTC timestamp.
       * Only available to admin users.
       * </pre>
       *
       * <code>optional string expire_time = 8;</code>
       * @return The bytes for expireTime.
       */
      public com.google.protobuf.ByteString
          getExpireTimeBytes() {
        java.lang.Object ref = expireTime_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          expireTime_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * The date after which the token is invalid, as an ISO8061 UTC timestamp.
       * Only available to admin users.
       * </pre>
       *
       * <code>optional string expire_time = 8;</code>
       * @param value The expireTime to set.
       * @return This builder for chaining.
       */
      public Builder setExpireTime(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000080;
        expireTime_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The date after which the token is invalid, as an ISO8061 UTC timestamp.
       * Only available to admin users.
       * </pre>
       *
       * <code>optional string expire_time = 8;</code>
       * @return This builder for chaining.
       */
      public Builder clearExpireTime() {
        bitField0_ = (bitField0_ & ~0x00000080);
        expireTime_ = getDefaultInstance().getExpireTime();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The date after which the token is invalid, as an ISO8061 UTC timestamp.
       * Only available to admin users.
       * </pre>
       *
       * <code>optional string expire_time = 8;</code>
       * @param value The bytes for expireTime to set.
       * @return This builder for chaining.
       */
      public Builder setExpireTimeBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000080;
        expireTime_ = value;
        onChanged();
        return this;
      }

      private java.lang.Object pin_ = "";
      /**
       * <pre>
       * The token's pin, if any.
       * Only available to admin users.
       * </pre>
       *
       * <code>optional string pin = 9;</code>
       * @return Whether the pin field is set.
       */
      public boolean hasPin() {
        return ((bitField0_ & 0x00000100) != 0);
      }
      /**
       * <pre>
       * The token's pin, if any.
       * Only available to admin users.
       * </pre>
       *
       * <code>optional string pin = 9;</code>
       * @return The pin.
       */
      public java.lang.String getPin() {
        java.lang.Object ref = pin_;
        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()) {
            pin_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * The token's pin, if any.
       * Only available to admin users.
       * </pre>
       *
       * <code>optional string pin = 9;</code>
       * @return The bytes for pin.
       */
      public com.google.protobuf.ByteString
          getPinBytes() {
        java.lang.Object ref = pin_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          pin_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * The token's pin, if any.
       * Only available to admin users.
       * </pre>
       *
       * <code>optional string pin = 9;</code>
       * @param value The pin to set.
       * @return This builder for chaining.
       */
      public Builder setPin(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000100;
        pin_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The token's pin, if any.
       * Only available to admin users.
       * </pre>
       *
       * <code>optional string pin = 9;</code>
       * @return This builder for chaining.
       */
      public Builder clearPin() {
        bitField0_ = (bitField0_ & ~0x00000100);
        pin_ = getDefaultInstance().getPin();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The token's pin, if any.
       * Only available to admin users.
       * </pre>
       *
       * <code>optional string pin = 9;</code>
       * @param value The bytes for pin to set.
       * @return This builder for chaining.
       */
      public Builder setPinBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000100;
        pin_ = value;
        onChanged();
        return this;
      }

      private org.kegbot.proto.Models.User user_;
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.User, org.kegbot.proto.Models.User.Builder, org.kegbot.proto.Models.UserOrBuilder> userBuilder_;
      /**
       * <code>optional .User user = 10;</code>
       * @return Whether the user field is set.
       */
      public boolean hasUser() {
        return ((bitField0_ & 0x00000200) != 0);
      }
      /**
       * <code>optional .User user = 10;</code>
       * @return The user.
       */
      public org.kegbot.proto.Models.User getUser() {
        if (userBuilder_ == null) {
          return user_ == null ? org.kegbot.proto.Models.User.getDefaultInstance() : user_;
        } else {
          return userBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .User user = 10;</code>
       */
      public Builder setUser(org.kegbot.proto.Models.User value) {
        if (userBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          user_ = value;
          onChanged();
        } else {
          userBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000200;
        return this;
      }
      /**
       * <code>optional .User user = 10;</code>
       */
      public Builder setUser(
          org.kegbot.proto.Models.User.Builder builderForValue) {
        if (userBuilder_ == null) {
          user_ = builderForValue.build();
          onChanged();
        } else {
          userBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000200;
        return this;
      }
      /**
       * <code>optional .User user = 10;</code>
       */
      public Builder mergeUser(org.kegbot.proto.Models.User value) {
        if (userBuilder_ == null) {
          if (((bitField0_ & 0x00000200) != 0) &&
              user_ != null &&
              user_ != org.kegbot.proto.Models.User.getDefaultInstance()) {
            user_ =
              org.kegbot.proto.Models.User.newBuilder(user_).mergeFrom(value).buildPartial();
          } else {
            user_ = value;
          }
          onChanged();
        } else {
          userBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000200;
        return this;
      }
      /**
       * <code>optional .User user = 10;</code>
       */
      public Builder clearUser() {
        if (userBuilder_ == null) {
          user_ = null;
          onChanged();
        } else {
          userBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000200);
        return this;
      }
      /**
       * <code>optional .User user = 10;</code>
       */
      public org.kegbot.proto.Models.User.Builder getUserBuilder() {
        bitField0_ |= 0x00000200;
        onChanged();
        return getUserFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .User user = 10;</code>
       */
      public org.kegbot.proto.Models.UserOrBuilder getUserOrBuilder() {
        if (userBuilder_ != null) {
          return userBuilder_.getMessageOrBuilder();
        } else {
          return user_ == null ?
              org.kegbot.proto.Models.User.getDefaultInstance() : user_;
        }
      }
      /**
       * <code>optional .User user = 10;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.User, org.kegbot.proto.Models.User.Builder, org.kegbot.proto.Models.UserOrBuilder> 
          getUserFieldBuilder() {
        if (userBuilder_ == null) {
          userBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              org.kegbot.proto.Models.User, org.kegbot.proto.Models.User.Builder, org.kegbot.proto.Models.UserOrBuilder>(
                  getUser(),
                  getParentForChildren(),
                  isClean());
          user_ = null;
        }
        return userBuilder_;
      }
      @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:AuthenticationToken)
    }

    // @@protoc_insertion_point(class_scope:AuthenticationToken)
    private static final org.kegbot.proto.Models.AuthenticationToken DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new org.kegbot.proto.Models.AuthenticationToken();
    }

    public static org.kegbot.proto.Models.AuthenticationToken getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

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

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

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

    @java.lang.Override
    public org.kegbot.proto.Models.AuthenticationToken getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface BeverageProducerOrBuilder extends
      // @@protoc_insertion_point(interface_extends:BeverageProducer)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <pre>
     * The unique identifier for this producer.
     * </pre>
     *
     * <code>required uint32 id = 1;</code>
     * @return Whether the id field is set.
     */
    boolean hasId();
    /**
     * <pre>
     * The unique identifier for this producer.
     * </pre>
     *
     * <code>required uint32 id = 1;</code>
     * @return The id.
     */
    int getId();

    /**
     * <pre>
     * The name of the brewer or production company.
     * </pre>
     *
     * <code>required string name = 2;</code>
     * @return Whether the name field is set.
     */
    boolean hasName();
    /**
     * <pre>
     * The name of the brewer or production company.
     * </pre>
     *
     * <code>required string name = 2;</code>
     * @return The name.
     */
    java.lang.String getName();
    /**
     * <pre>
     * The name of the brewer or production company.
     * </pre>
     *
     * <code>required string name = 2;</code>
     * @return The bytes for name.
     */
    com.google.protobuf.ByteString
        getNameBytes();

    /**
     * <pre>
     * Country of origin.
     * </pre>
     *
     * <code>optional string country = 3;</code>
     * @return Whether the country field is set.
     */
    boolean hasCountry();
    /**
     * <pre>
     * Country of origin.
     * </pre>
     *
     * <code>optional string country = 3;</code>
     * @return The country.
     */
    java.lang.String getCountry();
    /**
     * <pre>
     * Country of origin.
     * </pre>
     *
     * <code>optional string country = 3;</code>
     * @return The bytes for country.
     */
    com.google.protobuf.ByteString
        getCountryBytes();

    /**
     * <pre>
     * State of origin.
     * </pre>
     *
     * <code>optional string origin_state = 4;</code>
     * @return Whether the originState field is set.
     */
    boolean hasOriginState();
    /**
     * <pre>
     * State of origin.
     * </pre>
     *
     * <code>optional string origin_state = 4;</code>
     * @return The originState.
     */
    java.lang.String getOriginState();
    /**
     * <pre>
     * State of origin.
     * </pre>
     *
     * <code>optional string origin_state = 4;</code>
     * @return The bytes for originState.
     */
    com.google.protobuf.ByteString
        getOriginStateBytes();

    /**
     * <pre>
     * City of origin.
     * </pre>
     *
     * <code>optional string origin_city = 5;</code>
     * @return Whether the originCity field is set.
     */
    boolean hasOriginCity();
    /**
     * <pre>
     * City of origin.
     * </pre>
     *
     * <code>optional string origin_city = 5;</code>
     * @return The originCity.
     */
    java.lang.String getOriginCity();
    /**
     * <pre>
     * City of origin.
     * </pre>
     *
     * <code>optional string origin_city = 5;</code>
     * @return The bytes for originCity.
     */
    com.google.protobuf.ByteString
        getOriginCityBytes();

    /**
     * <pre>
     * True if this is a home producer.
     * </pre>
     *
     * <code>optional bool is_homebrew = 6;</code>
     * @return Whether the isHomebrew field is set.
     */
    boolean hasIsHomebrew();
    /**
     * <pre>
     * True if this is a home producer.
     * </pre>
     *
     * <code>optional bool is_homebrew = 6;</code>
     * @return The isHomebrew.
     */
    boolean getIsHomebrew();

    /**
     * <pre>
     * URL for producer.
     * </pre>
     *
     * <code>optional string url = 7;</code>
     * @return Whether the url field is set.
     */
    boolean hasUrl();
    /**
     * <pre>
     * URL for producer.
     * </pre>
     *
     * <code>optional string url = 7;</code>
     * @return The url.
     */
    java.lang.String getUrl();
    /**
     * <pre>
     * URL for producer.
     * </pre>
     *
     * <code>optional string url = 7;</code>
     * @return The bytes for url.
     */
    com.google.protobuf.ByteString
        getUrlBytes();

    /**
     * <pre>
     * Free-form description.
     * </pre>
     *
     * <code>optional string description = 8;</code>
     * @return Whether the description field is set.
     */
    boolean hasDescription();
    /**
     * <pre>
     * Free-form description.
     * </pre>
     *
     * <code>optional string description = 8;</code>
     * @return The description.
     */
    java.lang.String getDescription();
    /**
     * <pre>
     * Free-form description.
     * </pre>
     *
     * <code>optional string description = 8;</code>
     * @return The bytes for description.
     */
    com.google.protobuf.ByteString
        getDescriptionBytes();

    /**
     * <pre>
     * Image.
     * </pre>
     *
     * <code>optional .Image picture = 9;</code>
     * @return Whether the picture field is set.
     */
    boolean hasPicture();
    /**
     * <pre>
     * Image.
     * </pre>
     *
     * <code>optional .Image picture = 9;</code>
     * @return The picture.
     */
    org.kegbot.proto.Models.Image getPicture();
    /**
     * <pre>
     * Image.
     * </pre>
     *
     * <code>optional .Image picture = 9;</code>
     */
    org.kegbot.proto.Models.ImageOrBuilder getPictureOrBuilder();
  }
  /**
   * <pre>
   * A beverage production company or brand.
   * </pre>
   *
   * Protobuf type {@code BeverageProducer}
   */
  public static final class BeverageProducer extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:BeverageProducer)
      BeverageProducerOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use BeverageProducer.newBuilder() to construct.
    private BeverageProducer(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private BeverageProducer() {
      name_ = "";
      country_ = "";
      originState_ = "";
      originCity_ = "";
      url_ = "";
      description_ = "";
    }

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

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return org.kegbot.proto.Models.internal_static_BeverageProducer_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return org.kegbot.proto.Models.internal_static_BeverageProducer_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              org.kegbot.proto.Models.BeverageProducer.class, org.kegbot.proto.Models.BeverageProducer.Builder.class);
    }

    private int bitField0_;
    public static final int ID_FIELD_NUMBER = 1;
    private int id_;
    /**
     * <pre>
     * The unique identifier for this producer.
     * </pre>
     *
     * <code>required uint32 id = 1;</code>
     * @return Whether the id field is set.
     */
    @java.lang.Override
    public boolean hasId() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <pre>
     * The unique identifier for this producer.
     * </pre>
     *
     * <code>required uint32 id = 1;</code>
     * @return The id.
     */
    @java.lang.Override
    public int getId() {
      return id_;
    }

    public static final int NAME_FIELD_NUMBER = 2;
    private volatile java.lang.Object name_;
    /**
     * <pre>
     * The name of the brewer or production company.
     * </pre>
     *
     * <code>required string name = 2;</code>
     * @return Whether the name field is set.
     */
    @java.lang.Override
    public boolean hasName() {
      return ((bitField0_ & 0x00000002) != 0);
    }
    /**
     * <pre>
     * The name of the brewer or production company.
     * </pre>
     *
     * <code>required 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>
     * The name of the brewer or production company.
     * </pre>
     *
     * <code>required 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 COUNTRY_FIELD_NUMBER = 3;
    private volatile java.lang.Object country_;
    /**
     * <pre>
     * Country of origin.
     * </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 of origin.
     * </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 of origin.
     * </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 ORIGIN_STATE_FIELD_NUMBER = 4;
    private volatile java.lang.Object originState_;
    /**
     * <pre>
     * State of origin.
     * </pre>
     *
     * <code>optional string origin_state = 4;</code>
     * @return Whether the originState field is set.
     */
    @java.lang.Override
    public boolean hasOriginState() {
      return ((bitField0_ & 0x00000008) != 0);
    }
    /**
     * <pre>
     * State of origin.
     * </pre>
     *
     * <code>optional string origin_state = 4;</code>
     * @return The originState.
     */
    @java.lang.Override
    public java.lang.String getOriginState() {
      java.lang.Object ref = originState_;
      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()) {
          originState_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * State of origin.
     * </pre>
     *
     * <code>optional string origin_state = 4;</code>
     * @return The bytes for originState.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getOriginStateBytes() {
      java.lang.Object ref = originState_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        originState_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int ORIGIN_CITY_FIELD_NUMBER = 5;
    private volatile java.lang.Object originCity_;
    /**
     * <pre>
     * City of origin.
     * </pre>
     *
     * <code>optional string origin_city = 5;</code>
     * @return Whether the originCity field is set.
     */
    @java.lang.Override
    public boolean hasOriginCity() {
      return ((bitField0_ & 0x00000010) != 0);
    }
    /**
     * <pre>
     * City of origin.
     * </pre>
     *
     * <code>optional string origin_city = 5;</code>
     * @return The originCity.
     */
    @java.lang.Override
    public java.lang.String getOriginCity() {
      java.lang.Object ref = originCity_;
      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()) {
          originCity_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * City of origin.
     * </pre>
     *
     * <code>optional string origin_city = 5;</code>
     * @return The bytes for originCity.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getOriginCityBytes() {
      java.lang.Object ref = originCity_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        originCity_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int IS_HOMEBREW_FIELD_NUMBER = 6;
    private boolean isHomebrew_;
    /**
     * <pre>
     * True if this is a home producer.
     * </pre>
     *
     * <code>optional bool is_homebrew = 6;</code>
     * @return Whether the isHomebrew field is set.
     */
    @java.lang.Override
    public boolean hasIsHomebrew() {
      return ((bitField0_ & 0x00000020) != 0);
    }
    /**
     * <pre>
     * True if this is a home producer.
     * </pre>
     *
     * <code>optional bool is_homebrew = 6;</code>
     * @return The isHomebrew.
     */
    @java.lang.Override
    public boolean getIsHomebrew() {
      return isHomebrew_;
    }

    public static final int URL_FIELD_NUMBER = 7;
    private volatile java.lang.Object url_;
    /**
     * <pre>
     * URL for producer.
     * </pre>
     *
     * <code>optional string url = 7;</code>
     * @return Whether the url field is set.
     */
    @java.lang.Override
    public boolean hasUrl() {
      return ((bitField0_ & 0x00000040) != 0);
    }
    /**
     * <pre>
     * URL for producer.
     * </pre>
     *
     * <code>optional string url = 7;</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 for producer.
     * </pre>
     *
     * <code>optional string url = 7;</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 DESCRIPTION_FIELD_NUMBER = 8;
    private volatile java.lang.Object description_;
    /**
     * <pre>
     * Free-form description.
     * </pre>
     *
     * <code>optional string description = 8;</code>
     * @return Whether the description field is set.
     */
    @java.lang.Override
    public boolean hasDescription() {
      return ((bitField0_ & 0x00000080) != 0);
    }
    /**
     * <pre>
     * Free-form description.
     * </pre>
     *
     * <code>optional string description = 8;</code>
     * @return The description.
     */
    @java.lang.Override
    public java.lang.String getDescription() {
      java.lang.Object ref = description_;
      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()) {
          description_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * Free-form description.
     * </pre>
     *
     * <code>optional string description = 8;</code>
     * @return The bytes for description.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getDescriptionBytes() {
      java.lang.Object ref = description_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        description_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int PICTURE_FIELD_NUMBER = 9;
    private org.kegbot.proto.Models.Image picture_;
    /**
     * <pre>
     * Image.
     * </pre>
     *
     * <code>optional .Image picture = 9;</code>
     * @return Whether the picture field is set.
     */
    @java.lang.Override
    public boolean hasPicture() {
      return ((bitField0_ & 0x00000100) != 0);
    }
    /**
     * <pre>
     * Image.
     * </pre>
     *
     * <code>optional .Image picture = 9;</code>
     * @return The picture.
     */
    @java.lang.Override
    public org.kegbot.proto.Models.Image getPicture() {
      return picture_ == null ? org.kegbot.proto.Models.Image.getDefaultInstance() : picture_;
    }
    /**
     * <pre>
     * Image.
     * </pre>
     *
     * <code>optional .Image picture = 9;</code>
     */
    @java.lang.Override
    public org.kegbot.proto.Models.ImageOrBuilder getPictureOrBuilder() {
      return picture_ == null ? org.kegbot.proto.Models.Image.getDefaultInstance() : picture_;
    }

    public static org.kegbot.proto.Models.BeverageProducer parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.BeverageProducer parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.BeverageProducer parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.BeverageProducer parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.BeverageProducer parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.BeverageProducer parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.BeverageProducer parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.BeverageProducer 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 org.kegbot.proto.Models.BeverageProducer parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.BeverageProducer 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 org.kegbot.proto.Models.BeverageProducer parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.BeverageProducer 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(org.kegbot.proto.Models.BeverageProducer 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 beverage production company or brand.
     * </pre>
     *
     * Protobuf type {@code BeverageProducer}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:BeverageProducer)
        org.kegbot.proto.Models.BeverageProducerOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return org.kegbot.proto.Models.internal_static_BeverageProducer_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return org.kegbot.proto.Models.internal_static_BeverageProducer_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                org.kegbot.proto.Models.BeverageProducer.class, org.kegbot.proto.Models.BeverageProducer.Builder.class);
      }

      // Construct using org.kegbot.proto.Models.BeverageProducer.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
          getPictureFieldBuilder();
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        id_ = 0;
        bitField0_ = (bitField0_ & ~0x00000001);
        name_ = "";
        bitField0_ = (bitField0_ & ~0x00000002);
        country_ = "";
        bitField0_ = (bitField0_ & ~0x00000004);
        originState_ = "";
        bitField0_ = (bitField0_ & ~0x00000008);
        originCity_ = "";
        bitField0_ = (bitField0_ & ~0x00000010);
        isHomebrew_ = false;
        bitField0_ = (bitField0_ & ~0x00000020);
        url_ = "";
        bitField0_ = (bitField0_ & ~0x00000040);
        description_ = "";
        bitField0_ = (bitField0_ & ~0x00000080);
        if (pictureBuilder_ == null) {
          picture_ = null;
        } else {
          pictureBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000100);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return org.kegbot.proto.Models.internal_static_BeverageProducer_descriptor;
      }

      @java.lang.Override
      public org.kegbot.proto.Models.BeverageProducer getDefaultInstanceForType() {
        return org.kegbot.proto.Models.BeverageProducer.getDefaultInstance();
      }

      @java.lang.Override
      public org.kegbot.proto.Models.BeverageProducer build() {
        org.kegbot.proto.Models.BeverageProducer result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public org.kegbot.proto.Models.BeverageProducer buildPartial() {
        org.kegbot.proto.Models.BeverageProducer result = new org.kegbot.proto.Models.BeverageProducer(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)) {
          to_bitField0_ |= 0x00000002;
        }
        result.name_ = name_;
        if (((from_bitField0_ & 0x00000004) != 0)) {
          to_bitField0_ |= 0x00000004;
        }
        result.country_ = country_;
        if (((from_bitField0_ & 0x00000008) != 0)) {
          to_bitField0_ |= 0x00000008;
        }
        result.originState_ = originState_;
        if (((from_bitField0_ & 0x00000010) != 0)) {
          to_bitField0_ |= 0x00000010;
        }
        result.originCity_ = originCity_;
        if (((from_bitField0_ & 0x00000020) != 0)) {
          result.isHomebrew_ = isHomebrew_;
          to_bitField0_ |= 0x00000020;
        }
        if (((from_bitField0_ & 0x00000040) != 0)) {
          to_bitField0_ |= 0x00000040;
        }
        result.url_ = url_;
        if (((from_bitField0_ & 0x00000080) != 0)) {
          to_bitField0_ |= 0x00000080;
        }
        result.description_ = description_;
        if (((from_bitField0_ & 0x00000100) != 0)) {
          if (pictureBuilder_ == null) {
            result.picture_ = picture_;
          } else {
            result.picture_ = pictureBuilder_.build();
          }
          to_bitField0_ |= 0x00000100;
        }
        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);
      }
      private int bitField0_;

      private int id_ ;
      /**
       * <pre>
       * The unique identifier for this producer.
       * </pre>
       *
       * <code>required uint32 id = 1;</code>
       * @return Whether the id field is set.
       */
      @java.lang.Override
      public boolean hasId() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <pre>
       * The unique identifier for this producer.
       * </pre>
       *
       * <code>required uint32 id = 1;</code>
       * @return The id.
       */
      @java.lang.Override
      public int getId() {
        return id_;
      }
      /**
       * <pre>
       * The unique identifier for this producer.
       * </pre>
       *
       * <code>required uint32 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>
       * The unique identifier for this producer.
       * </pre>
       *
       * <code>required uint32 id = 1;</code>
       * @return This builder for chaining.
       */
      public Builder clearId() {
        bitField0_ = (bitField0_ & ~0x00000001);
        id_ = 0;
        onChanged();
        return this;
      }

      private java.lang.Object name_ = "";
      /**
       * <pre>
       * The name of the brewer or production company.
       * </pre>
       *
       * <code>required string name = 2;</code>
       * @return Whether the name field is set.
       */
      public boolean hasName() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <pre>
       * The name of the brewer or production company.
       * </pre>
       *
       * <code>required 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>
       * The name of the brewer or production company.
       * </pre>
       *
       * <code>required 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>
       * The name of the brewer or production company.
       * </pre>
       *
       * <code>required 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>
       * The name of the brewer or production company.
       * </pre>
       *
       * <code>required string name = 2;</code>
       * @return This builder for chaining.
       */
      public Builder clearName() {
        bitField0_ = (bitField0_ & ~0x00000002);
        name_ = getDefaultInstance().getName();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The name of the brewer or production company.
       * </pre>
       *
       * <code>required 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 country_ = "";
      /**
       * <pre>
       * Country of origin.
       * </pre>
       *
       * <code>optional string country = 3;</code>
       * @return Whether the country field is set.
       */
      public boolean hasCountry() {
        return ((bitField0_ & 0x00000004) != 0);
      }
      /**
       * <pre>
       * Country of origin.
       * </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 of origin.
       * </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 of origin.
       * </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 of origin.
       * </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 of origin.
       * </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 originState_ = "";
      /**
       * <pre>
       * State of origin.
       * </pre>
       *
       * <code>optional string origin_state = 4;</code>
       * @return Whether the originState field is set.
       */
      public boolean hasOriginState() {
        return ((bitField0_ & 0x00000008) != 0);
      }
      /**
       * <pre>
       * State of origin.
       * </pre>
       *
       * <code>optional string origin_state = 4;</code>
       * @return The originState.
       */
      public java.lang.String getOriginState() {
        java.lang.Object ref = originState_;
        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()) {
            originState_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * State of origin.
       * </pre>
       *
       * <code>optional string origin_state = 4;</code>
       * @return The bytes for originState.
       */
      public com.google.protobuf.ByteString
          getOriginStateBytes() {
        java.lang.Object ref = originState_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          originState_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * State of origin.
       * </pre>
       *
       * <code>optional string origin_state = 4;</code>
       * @param value The originState to set.
       * @return This builder for chaining.
       */
      public Builder setOriginState(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
        originState_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * State of origin.
       * </pre>
       *
       * <code>optional string origin_state = 4;</code>
       * @return This builder for chaining.
       */
      public Builder clearOriginState() {
        bitField0_ = (bitField0_ & ~0x00000008);
        originState_ = getDefaultInstance().getOriginState();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * State of origin.
       * </pre>
       *
       * <code>optional string origin_state = 4;</code>
       * @param value The bytes for originState to set.
       * @return This builder for chaining.
       */
      public Builder setOriginStateBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
        originState_ = value;
        onChanged();
        return this;
      }

      private java.lang.Object originCity_ = "";
      /**
       * <pre>
       * City of origin.
       * </pre>
       *
       * <code>optional string origin_city = 5;</code>
       * @return Whether the originCity field is set.
       */
      public boolean hasOriginCity() {
        return ((bitField0_ & 0x00000010) != 0);
      }
      /**
       * <pre>
       * City of origin.
       * </pre>
       *
       * <code>optional string origin_city = 5;</code>
       * @return The originCity.
       */
      public java.lang.String getOriginCity() {
        java.lang.Object ref = originCity_;
        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()) {
            originCity_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * City of origin.
       * </pre>
       *
       * <code>optional string origin_city = 5;</code>
       * @return The bytes for originCity.
       */
      public com.google.protobuf.ByteString
          getOriginCityBytes() {
        java.lang.Object ref = originCity_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          originCity_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * City of origin.
       * </pre>
       *
       * <code>optional string origin_city = 5;</code>
       * @param value The originCity to set.
       * @return This builder for chaining.
       */
      public Builder setOriginCity(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
        originCity_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * City of origin.
       * </pre>
       *
       * <code>optional string origin_city = 5;</code>
       * @return This builder for chaining.
       */
      public Builder clearOriginCity() {
        bitField0_ = (bitField0_ & ~0x00000010);
        originCity_ = getDefaultInstance().getOriginCity();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * City of origin.
       * </pre>
       *
       * <code>optional string origin_city = 5;</code>
       * @param value The bytes for originCity to set.
       * @return This builder for chaining.
       */
      public Builder setOriginCityBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
        originCity_ = value;
        onChanged();
        return this;
      }

      private boolean isHomebrew_ ;
      /**
       * <pre>
       * True if this is a home producer.
       * </pre>
       *
       * <code>optional bool is_homebrew = 6;</code>
       * @return Whether the isHomebrew field is set.
       */
      @java.lang.Override
      public boolean hasIsHomebrew() {
        return ((bitField0_ & 0x00000020) != 0);
      }
      /**
       * <pre>
       * True if this is a home producer.
       * </pre>
       *
       * <code>optional bool is_homebrew = 6;</code>
       * @return The isHomebrew.
       */
      @java.lang.Override
      public boolean getIsHomebrew() {
        return isHomebrew_;
      }
      /**
       * <pre>
       * True if this is a home producer.
       * </pre>
       *
       * <code>optional bool is_homebrew = 6;</code>
       * @param value The isHomebrew to set.
       * @return This builder for chaining.
       */
      public Builder setIsHomebrew(boolean value) {
        bitField0_ |= 0x00000020;
        isHomebrew_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * True if this is a home producer.
       * </pre>
       *
       * <code>optional bool is_homebrew = 6;</code>
       * @return This builder for chaining.
       */
      public Builder clearIsHomebrew() {
        bitField0_ = (bitField0_ & ~0x00000020);
        isHomebrew_ = false;
        onChanged();
        return this;
      }

      private java.lang.Object url_ = "";
      /**
       * <pre>
       * URL for producer.
       * </pre>
       *
       * <code>optional string url = 7;</code>
       * @return Whether the url field is set.
       */
      public boolean hasUrl() {
        return ((bitField0_ & 0x00000040) != 0);
      }
      /**
       * <pre>
       * URL for producer.
       * </pre>
       *
       * <code>optional string url = 7;</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 for producer.
       * </pre>
       *
       * <code>optional string url = 7;</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 for producer.
       * </pre>
       *
       * <code>optional string url = 7;</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_ |= 0x00000040;
        url_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * URL for producer.
       * </pre>
       *
       * <code>optional string url = 7;</code>
       * @return This builder for chaining.
       */
      public Builder clearUrl() {
        bitField0_ = (bitField0_ & ~0x00000040);
        url_ = getDefaultInstance().getUrl();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * URL for producer.
       * </pre>
       *
       * <code>optional string url = 7;</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_ |= 0x00000040;
        url_ = value;
        onChanged();
        return this;
      }

      private java.lang.Object description_ = "";
      /**
       * <pre>
       * Free-form description.
       * </pre>
       *
       * <code>optional string description = 8;</code>
       * @return Whether the description field is set.
       */
      public boolean hasDescription() {
        return ((bitField0_ & 0x00000080) != 0);
      }
      /**
       * <pre>
       * Free-form description.
       * </pre>
       *
       * <code>optional string description = 8;</code>
       * @return The description.
       */
      public java.lang.String getDescription() {
        java.lang.Object ref = description_;
        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()) {
            description_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * Free-form description.
       * </pre>
       *
       * <code>optional string description = 8;</code>
       * @return The bytes for description.
       */
      public com.google.protobuf.ByteString
          getDescriptionBytes() {
        java.lang.Object ref = description_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          description_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * Free-form description.
       * </pre>
       *
       * <code>optional string description = 8;</code>
       * @param value The description to set.
       * @return This builder for chaining.
       */
      public Builder setDescription(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000080;
        description_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Free-form description.
       * </pre>
       *
       * <code>optional string description = 8;</code>
       * @return This builder for chaining.
       */
      public Builder clearDescription() {
        bitField0_ = (bitField0_ & ~0x00000080);
        description_ = getDefaultInstance().getDescription();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Free-form description.
       * </pre>
       *
       * <code>optional string description = 8;</code>
       * @param value The bytes for description to set.
       * @return This builder for chaining.
       */
      public Builder setDescriptionBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000080;
        description_ = value;
        onChanged();
        return this;
      }

      private org.kegbot.proto.Models.Image picture_;
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.Image, org.kegbot.proto.Models.Image.Builder, org.kegbot.proto.Models.ImageOrBuilder> pictureBuilder_;
      /**
       * <pre>
       * Image.
       * </pre>
       *
       * <code>optional .Image picture = 9;</code>
       * @return Whether the picture field is set.
       */
      public boolean hasPicture() {
        return ((bitField0_ & 0x00000100) != 0);
      }
      /**
       * <pre>
       * Image.
       * </pre>
       *
       * <code>optional .Image picture = 9;</code>
       * @return The picture.
       */
      public org.kegbot.proto.Models.Image getPicture() {
        if (pictureBuilder_ == null) {
          return picture_ == null ? org.kegbot.proto.Models.Image.getDefaultInstance() : picture_;
        } else {
          return pictureBuilder_.getMessage();
        }
      }
      /**
       * <pre>
       * Image.
       * </pre>
       *
       * <code>optional .Image picture = 9;</code>
       */
      public Builder setPicture(org.kegbot.proto.Models.Image value) {
        if (pictureBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          picture_ = value;
          onChanged();
        } else {
          pictureBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000100;
        return this;
      }
      /**
       * <pre>
       * Image.
       * </pre>
       *
       * <code>optional .Image picture = 9;</code>
       */
      public Builder setPicture(
          org.kegbot.proto.Models.Image.Builder builderForValue) {
        if (pictureBuilder_ == null) {
          picture_ = builderForValue.build();
          onChanged();
        } else {
          pictureBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000100;
        return this;
      }
      /**
       * <pre>
       * Image.
       * </pre>
       *
       * <code>optional .Image picture = 9;</code>
       */
      public Builder mergePicture(org.kegbot.proto.Models.Image value) {
        if (pictureBuilder_ == null) {
          if (((bitField0_ & 0x00000100) != 0) &&
              picture_ != null &&
              picture_ != org.kegbot.proto.Models.Image.getDefaultInstance()) {
            picture_ =
              org.kegbot.proto.Models.Image.newBuilder(picture_).mergeFrom(value).buildPartial();
          } else {
            picture_ = value;
          }
          onChanged();
        } else {
          pictureBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000100;
        return this;
      }
      /**
       * <pre>
       * Image.
       * </pre>
       *
       * <code>optional .Image picture = 9;</code>
       */
      public Builder clearPicture() {
        if (pictureBuilder_ == null) {
          picture_ = null;
          onChanged();
        } else {
          pictureBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000100);
        return this;
      }
      /**
       * <pre>
       * Image.
       * </pre>
       *
       * <code>optional .Image picture = 9;</code>
       */
      public org.kegbot.proto.Models.Image.Builder getPictureBuilder() {
        bitField0_ |= 0x00000100;
        onChanged();
        return getPictureFieldBuilder().getBuilder();
      }
      /**
       * <pre>
       * Image.
       * </pre>
       *
       * <code>optional .Image picture = 9;</code>
       */
      public org.kegbot.proto.Models.ImageOrBuilder getPictureOrBuilder() {
        if (pictureBuilder_ != null) {
          return pictureBuilder_.getMessageOrBuilder();
        } else {
          return picture_ == null ?
              org.kegbot.proto.Models.Image.getDefaultInstance() : picture_;
        }
      }
      /**
       * <pre>
       * Image.
       * </pre>
       *
       * <code>optional .Image picture = 9;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.Image, org.kegbot.proto.Models.Image.Builder, org.kegbot.proto.Models.ImageOrBuilder> 
          getPictureFieldBuilder() {
        if (pictureBuilder_ == null) {
          pictureBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              org.kegbot.proto.Models.Image, org.kegbot.proto.Models.Image.Builder, org.kegbot.proto.Models.ImageOrBuilder>(
                  getPicture(),
                  getParentForChildren(),
                  isClean());
          picture_ = null;
        }
        return pictureBuilder_;
      }
      @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:BeverageProducer)
    }

    // @@protoc_insertion_point(class_scope:BeverageProducer)
    private static final org.kegbot.proto.Models.BeverageProducer DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new org.kegbot.proto.Models.BeverageProducer();
    }

    public static org.kegbot.proto.Models.BeverageProducer getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

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

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

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

    @java.lang.Override
    public org.kegbot.proto.Models.BeverageProducer getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface BeverageOrBuilder extends
      // @@protoc_insertion_point(interface_extends:Beverage)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <pre>
     * Unique id for this beverage.
     * </pre>
     *
     * <code>required uint32 id = 1;</code>
     * @return Whether the id field is set.
     */
    boolean hasId();
    /**
     * <pre>
     * Unique id for this beverage.
     * </pre>
     *
     * <code>required uint32 id = 1;</code>
     * @return The id.
     */
    int getId();

    /**
     * <pre>
     * Beverage name.
     * </pre>
     *
     * <code>required string name = 2;</code>
     * @return Whether the name field is set.
     */
    boolean hasName();
    /**
     * <pre>
     * Beverage name.
     * </pre>
     *
     * <code>required string name = 2;</code>
     * @return The name.
     */
    java.lang.String getName();
    /**
     * <pre>
     * Beverage name.
     * </pre>
     *
     * <code>required string name = 2;</code>
     * @return The bytes for name.
     */
    com.google.protobuf.ByteString
        getNameBytes();

    /**
     * <pre>
     * Producer.
     * </pre>
     *
     * <code>required .BeverageProducer producer = 3;</code>
     * @return Whether the producer field is set.
     */
    boolean hasProducer();
    /**
     * <pre>
     * Producer.
     * </pre>
     *
     * <code>required .BeverageProducer producer = 3;</code>
     * @return The producer.
     */
    org.kegbot.proto.Models.BeverageProducer getProducer();
    /**
     * <pre>
     * Producer.
     * </pre>
     *
     * <code>required .BeverageProducer producer = 3;</code>
     */
    org.kegbot.proto.Models.BeverageProducerOrBuilder getProducerOrBuilder();

    /**
     * <pre>
     * Type of beverage.
     * </pre>
     *
     * <code>required string beverage_type = 4;</code>
     * @return Whether the beverageType field is set.
     */
    boolean hasBeverageType();
    /**
     * <pre>
     * Type of beverage.
     * </pre>
     *
     * <code>required string beverage_type = 4;</code>
     * @return The beverageType.
     */
    java.lang.String getBeverageType();
    /**
     * <pre>
     * Type of beverage.
     * </pre>
     *
     * <code>required string beverage_type = 4;</code>
     * @return The bytes for beverageType.
     */
    com.google.protobuf.ByteString
        getBeverageTypeBytes();

    /**
     * <pre>
     * Beverage style.
     * </pre>
     *
     * <code>optional string style = 5;</code>
     * @return Whether the style field is set.
     */
    boolean hasStyle();
    /**
     * <pre>
     * Beverage style.
     * </pre>
     *
     * <code>optional string style = 5;</code>
     * @return The style.
     */
    java.lang.String getStyle();
    /**
     * <pre>
     * Beverage style.
     * </pre>
     *
     * <code>optional string style = 5;</code>
     * @return The bytes for style.
     */
    com.google.protobuf.ByteString
        getStyleBytes();

    /**
     * <pre>
     * Free-form description.
     * </pre>
     *
     * <code>optional string description = 6;</code>
     * @return Whether the description field is set.
     */
    boolean hasDescription();
    /**
     * <pre>
     * Free-form description.
     * </pre>
     *
     * <code>optional string description = 6;</code>
     * @return The description.
     */
    java.lang.String getDescription();
    /**
     * <pre>
     * Free-form description.
     * </pre>
     *
     * <code>optional string description = 6;</code>
     * @return The bytes for description.
     */
    com.google.protobuf.ByteString
        getDescriptionBytes();

    /**
     * <pre>
     * Logo or other image.
     * </pre>
     *
     * <code>optional .Image picture = 7;</code>
     * @return Whether the picture field is set.
     */
    boolean hasPicture();
    /**
     * <pre>
     * Logo or other image.
     * </pre>
     *
     * <code>optional .Image picture = 7;</code>
     * @return The picture.
     */
    org.kegbot.proto.Models.Image getPicture();
    /**
     * <pre>
     * Logo or other image.
     * </pre>
     *
     * <code>optional .Image picture = 7;</code>
     */
    org.kegbot.proto.Models.ImageOrBuilder getPictureOrBuilder();

    /**
     * <pre>
     * Vintage.
     * </pre>
     *
     * <code>optional uint32 vintage_year = 8;</code>
     * @return Whether the vintageYear field is set.
     */
    boolean hasVintageYear();
    /**
     * <pre>
     * Vintage.
     * </pre>
     *
     * <code>optional uint32 vintage_year = 8;</code>
     * @return The vintageYear.
     */
    int getVintageYear();

    /**
     * <pre>
     * Alcohol by volume (0.0-100.0).
     * </pre>
     *
     * <code>optional double abv_percent = 9;</code>
     * @return Whether the abvPercent field is set.
     */
    boolean hasAbvPercent();
    /**
     * <pre>
     * Alcohol by volume (0.0-100.0).
     * </pre>
     *
     * <code>optional double abv_percent = 9;</code>
     * @return The abvPercent.
     */
    double getAbvPercent();

    /**
     * <pre>
     * Calories.
     * </pre>
     *
     * <code>optional double calories_per_ml = 10;</code>
     * @return Whether the caloriesPerMl field is set.
     */
    boolean hasCaloriesPerMl();
    /**
     * <pre>
     * Calories.
     * </pre>
     *
     * <code>optional double calories_per_ml = 10;</code>
     * @return The caloriesPerMl.
     */
    double getCaloriesPerMl();

    /**
     * <pre>
     * Carbohydrates.
     * </pre>
     *
     * <code>optional double carbs_per_ml = 11;</code>
     * @return Whether the carbsPerMl field is set.
     */
    boolean hasCarbsPerMl();
    /**
     * <pre>
     * Carbohydrates.
     * </pre>
     *
     * <code>optional double carbs_per_ml = 11;</code>
     * @return The carbsPerMl.
     */
    double getCarbsPerMl();

    /**
     * <pre>
     * Original gravity.
     * </pre>
     *
     * <code>optional double original_gravity = 12;</code>
     * @return Whether the originalGravity field is set.
     */
    boolean hasOriginalGravity();
    /**
     * <pre>
     * Original gravity.
     * </pre>
     *
     * <code>optional double original_gravity = 12;</code>
     * @return The originalGravity.
     */
    double getOriginalGravity();

    /**
     * <pre>
     * Specific gravity.
     * </pre>
     *
     * <code>optional double specific_gravity = 13;</code>
     * @return Whether the specificGravity field is set.
     */
    boolean hasSpecificGravity();
    /**
     * <pre>
     * Specific gravity.
     * </pre>
     *
     * <code>optional double specific_gravity = 13;</code>
     * @return The specificGravity.
     */
    double getSpecificGravity();

    /**
     * <pre>
     * Untappd id (for beers only).
     * </pre>
     *
     * <code>optional string untappd_id = 14;</code>
     * @return Whether the untappdId field is set.
     */
    boolean hasUntappdId();
    /**
     * <pre>
     * Untappd id (for beers only).
     * </pre>
     *
     * <code>optional string untappd_id = 14;</code>
     * @return The untappdId.
     */
    java.lang.String getUntappdId();
    /**
     * <pre>
     * Untappd id (for beers only).
     * </pre>
     *
     * <code>optional string untappd_id = 14;</code>
     * @return The bytes for untappdId.
     */
    com.google.protobuf.ByteString
        getUntappdIdBytes();

    /**
     * <pre>
     * Beverage backend.
     * </pre>
     *
     * <code>optional string beverage_backend = 15;</code>
     * @return Whether the beverageBackend field is set.
     */
    boolean hasBeverageBackend();
    /**
     * <pre>
     * Beverage backend.
     * </pre>
     *
     * <code>optional string beverage_backend = 15;</code>
     * @return The beverageBackend.
     */
    java.lang.String getBeverageBackend();
    /**
     * <pre>
     * Beverage backend.
     * </pre>
     *
     * <code>optional string beverage_backend = 15;</code>
     * @return The bytes for beverageBackend.
     */
    com.google.protobuf.ByteString
        getBeverageBackendBytes();

    /**
     * <pre>
     * Id within beverage backend.
     * </pre>
     *
     * <code>optional string beverage_backend_id = 16;</code>
     * @return Whether the beverageBackendId field is set.
     */
    boolean hasBeverageBackendId();
    /**
     * <pre>
     * Id within beverage backend.
     * </pre>
     *
     * <code>optional string beverage_backend_id = 16;</code>
     * @return The beverageBackendId.
     */
    java.lang.String getBeverageBackendId();
    /**
     * <pre>
     * Id within beverage backend.
     * </pre>
     *
     * <code>optional string beverage_backend_id = 16;</code>
     * @return The bytes for beverageBackendId.
     */
    com.google.protobuf.ByteString
        getBeverageBackendIdBytes();

    /**
     * <code>optional string color_hex = 17;</code>
     * @return Whether the colorHex field is set.
     */
    boolean hasColorHex();
    /**
     * <code>optional string color_hex = 17;</code>
     * @return The colorHex.
     */
    java.lang.String getColorHex();
    /**
     * <code>optional string color_hex = 17;</code>
     * @return The bytes for colorHex.
     */
    com.google.protobuf.ByteString
        getColorHexBytes();

    /**
     * <code>optional double srm = 18;</code>
     * @return Whether the srm field is set.
     */
    boolean hasSrm();
    /**
     * <code>optional double srm = 18;</code>
     * @return The srm.
     */
    double getSrm();

    /**
     * <code>optional double ibu = 19;</code>
     * @return Whether the ibu field is set.
     */
    boolean hasIbu();
    /**
     * <code>optional double ibu = 19;</code>
     * @return The ibu.
     */
    double getIbu();

    /**
     * <code>optional double star_rating = 20;</code>
     * @return Whether the starRating field is set.
     */
    boolean hasStarRating();
    /**
     * <code>optional double star_rating = 20;</code>
     * @return The starRating.
     */
    double getStarRating();
  }
  /**
   * <pre>
   * A type of beer, coffee, wine, or other beverage.
   * </pre>
   *
   * Protobuf type {@code Beverage}
   */
  public static final class Beverage extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:Beverage)
      BeverageOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use Beverage.newBuilder() to construct.
    private Beverage(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private Beverage() {
      name_ = "";
      beverageType_ = "";
      style_ = "";
      description_ = "";
      untappdId_ = "";
      beverageBackend_ = "";
      beverageBackendId_ = "";
      colorHex_ = "";
    }

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

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return org.kegbot.proto.Models.internal_static_Beverage_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return org.kegbot.proto.Models.internal_static_Beverage_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              org.kegbot.proto.Models.Beverage.class, org.kegbot.proto.Models.Beverage.Builder.class);
    }

    private int bitField0_;
    public static final int ID_FIELD_NUMBER = 1;
    private int id_;
    /**
     * <pre>
     * Unique id for this beverage.
     * </pre>
     *
     * <code>required uint32 id = 1;</code>
     * @return Whether the id field is set.
     */
    @java.lang.Override
    public boolean hasId() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <pre>
     * Unique id for this beverage.
     * </pre>
     *
     * <code>required uint32 id = 1;</code>
     * @return The id.
     */
    @java.lang.Override
    public int getId() {
      return id_;
    }

    public static final int NAME_FIELD_NUMBER = 2;
    private volatile java.lang.Object name_;
    /**
     * <pre>
     * Beverage name.
     * </pre>
     *
     * <code>required string name = 2;</code>
     * @return Whether the name field is set.
     */
    @java.lang.Override
    public boolean hasName() {
      return ((bitField0_ & 0x00000002) != 0);
    }
    /**
     * <pre>
     * Beverage name.
     * </pre>
     *
     * <code>required 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>
     * Beverage name.
     * </pre>
     *
     * <code>required 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 PRODUCER_FIELD_NUMBER = 3;
    private org.kegbot.proto.Models.BeverageProducer producer_;
    /**
     * <pre>
     * Producer.
     * </pre>
     *
     * <code>required .BeverageProducer producer = 3;</code>
     * @return Whether the producer field is set.
     */
    @java.lang.Override
    public boolean hasProducer() {
      return ((bitField0_ & 0x00000004) != 0);
    }
    /**
     * <pre>
     * Producer.
     * </pre>
     *
     * <code>required .BeverageProducer producer = 3;</code>
     * @return The producer.
     */
    @java.lang.Override
    public org.kegbot.proto.Models.BeverageProducer getProducer() {
      return producer_ == null ? org.kegbot.proto.Models.BeverageProducer.getDefaultInstance() : producer_;
    }
    /**
     * <pre>
     * Producer.
     * </pre>
     *
     * <code>required .BeverageProducer producer = 3;</code>
     */
    @java.lang.Override
    public org.kegbot.proto.Models.BeverageProducerOrBuilder getProducerOrBuilder() {
      return producer_ == null ? org.kegbot.proto.Models.BeverageProducer.getDefaultInstance() : producer_;
    }

    public static final int BEVERAGE_TYPE_FIELD_NUMBER = 4;
    private volatile java.lang.Object beverageType_;
    /**
     * <pre>
     * Type of beverage.
     * </pre>
     *
     * <code>required string beverage_type = 4;</code>
     * @return Whether the beverageType field is set.
     */
    @java.lang.Override
    public boolean hasBeverageType() {
      return ((bitField0_ & 0x00000008) != 0);
    }
    /**
     * <pre>
     * Type of beverage.
     * </pre>
     *
     * <code>required string beverage_type = 4;</code>
     * @return The beverageType.
     */
    @java.lang.Override
    public java.lang.String getBeverageType() {
      java.lang.Object ref = beverageType_;
      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()) {
          beverageType_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * Type of beverage.
     * </pre>
     *
     * <code>required string beverage_type = 4;</code>
     * @return The bytes for beverageType.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getBeverageTypeBytes() {
      java.lang.Object ref = beverageType_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        beverageType_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int STYLE_FIELD_NUMBER = 5;
    private volatile java.lang.Object style_;
    /**
     * <pre>
     * Beverage style.
     * </pre>
     *
     * <code>optional string style = 5;</code>
     * @return Whether the style field is set.
     */
    @java.lang.Override
    public boolean hasStyle() {
      return ((bitField0_ & 0x00000010) != 0);
    }
    /**
     * <pre>
     * Beverage style.
     * </pre>
     *
     * <code>optional string style = 5;</code>
     * @return The style.
     */
    @java.lang.Override
    public java.lang.String getStyle() {
      java.lang.Object ref = style_;
      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()) {
          style_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * Beverage style.
     * </pre>
     *
     * <code>optional string style = 5;</code>
     * @return The bytes for style.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getStyleBytes() {
      java.lang.Object ref = style_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        style_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int DESCRIPTION_FIELD_NUMBER = 6;
    private volatile java.lang.Object description_;
    /**
     * <pre>
     * Free-form description.
     * </pre>
     *
     * <code>optional string description = 6;</code>
     * @return Whether the description field is set.
     */
    @java.lang.Override
    public boolean hasDescription() {
      return ((bitField0_ & 0x00000020) != 0);
    }
    /**
     * <pre>
     * Free-form description.
     * </pre>
     *
     * <code>optional string description = 6;</code>
     * @return The description.
     */
    @java.lang.Override
    public java.lang.String getDescription() {
      java.lang.Object ref = description_;
      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()) {
          description_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * Free-form description.
     * </pre>
     *
     * <code>optional string description = 6;</code>
     * @return The bytes for description.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getDescriptionBytes() {
      java.lang.Object ref = description_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        description_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int PICTURE_FIELD_NUMBER = 7;
    private org.kegbot.proto.Models.Image picture_;
    /**
     * <pre>
     * Logo or other image.
     * </pre>
     *
     * <code>optional .Image picture = 7;</code>
     * @return Whether the picture field is set.
     */
    @java.lang.Override
    public boolean hasPicture() {
      return ((bitField0_ & 0x00000040) != 0);
    }
    /**
     * <pre>
     * Logo or other image.
     * </pre>
     *
     * <code>optional .Image picture = 7;</code>
     * @return The picture.
     */
    @java.lang.Override
    public org.kegbot.proto.Models.Image getPicture() {
      return picture_ == null ? org.kegbot.proto.Models.Image.getDefaultInstance() : picture_;
    }
    /**
     * <pre>
     * Logo or other image.
     * </pre>
     *
     * <code>optional .Image picture = 7;</code>
     */
    @java.lang.Override
    public org.kegbot.proto.Models.ImageOrBuilder getPictureOrBuilder() {
      return picture_ == null ? org.kegbot.proto.Models.Image.getDefaultInstance() : picture_;
    }

    public static final int VINTAGE_YEAR_FIELD_NUMBER = 8;
    private int vintageYear_;
    /**
     * <pre>
     * Vintage.
     * </pre>
     *
     * <code>optional uint32 vintage_year = 8;</code>
     * @return Whether the vintageYear field is set.
     */
    @java.lang.Override
    public boolean hasVintageYear() {
      return ((bitField0_ & 0x00000080) != 0);
    }
    /**
     * <pre>
     * Vintage.
     * </pre>
     *
     * <code>optional uint32 vintage_year = 8;</code>
     * @return The vintageYear.
     */
    @java.lang.Override
    public int getVintageYear() {
      return vintageYear_;
    }

    public static final int ABV_PERCENT_FIELD_NUMBER = 9;
    private double abvPercent_;
    /**
     * <pre>
     * Alcohol by volume (0.0-100.0).
     * </pre>
     *
     * <code>optional double abv_percent = 9;</code>
     * @return Whether the abvPercent field is set.
     */
    @java.lang.Override
    public boolean hasAbvPercent() {
      return ((bitField0_ & 0x00000100) != 0);
    }
    /**
     * <pre>
     * Alcohol by volume (0.0-100.0).
     * </pre>
     *
     * <code>optional double abv_percent = 9;</code>
     * @return The abvPercent.
     */
    @java.lang.Override
    public double getAbvPercent() {
      return abvPercent_;
    }

    public static final int CALORIES_PER_ML_FIELD_NUMBER = 10;
    private double caloriesPerMl_;
    /**
     * <pre>
     * Calories.
     * </pre>
     *
     * <code>optional double calories_per_ml = 10;</code>
     * @return Whether the caloriesPerMl field is set.
     */
    @java.lang.Override
    public boolean hasCaloriesPerMl() {
      return ((bitField0_ & 0x00000200) != 0);
    }
    /**
     * <pre>
     * Calories.
     * </pre>
     *
     * <code>optional double calories_per_ml = 10;</code>
     * @return The caloriesPerMl.
     */
    @java.lang.Override
    public double getCaloriesPerMl() {
      return caloriesPerMl_;
    }

    public static final int CARBS_PER_ML_FIELD_NUMBER = 11;
    private double carbsPerMl_;
    /**
     * <pre>
     * Carbohydrates.
     * </pre>
     *
     * <code>optional double carbs_per_ml = 11;</code>
     * @return Whether the carbsPerMl field is set.
     */
    @java.lang.Override
    public boolean hasCarbsPerMl() {
      return ((bitField0_ & 0x00000400) != 0);
    }
    /**
     * <pre>
     * Carbohydrates.
     * </pre>
     *
     * <code>optional double carbs_per_ml = 11;</code>
     * @return The carbsPerMl.
     */
    @java.lang.Override
    public double getCarbsPerMl() {
      return carbsPerMl_;
    }

    public static final int ORIGINAL_GRAVITY_FIELD_NUMBER = 12;
    private double originalGravity_;
    /**
     * <pre>
     * Original gravity.
     * </pre>
     *
     * <code>optional double original_gravity = 12;</code>
     * @return Whether the originalGravity field is set.
     */
    @java.lang.Override
    public boolean hasOriginalGravity() {
      return ((bitField0_ & 0x00000800) != 0);
    }
    /**
     * <pre>
     * Original gravity.
     * </pre>
     *
     * <code>optional double original_gravity = 12;</code>
     * @return The originalGravity.
     */
    @java.lang.Override
    public double getOriginalGravity() {
      return originalGravity_;
    }

    public static final int SPECIFIC_GRAVITY_FIELD_NUMBER = 13;
    private double specificGravity_;
    /**
     * <pre>
     * Specific gravity.
     * </pre>
     *
     * <code>optional double specific_gravity = 13;</code>
     * @return Whether the specificGravity field is set.
     */
    @java.lang.Override
    public boolean hasSpecificGravity() {
      return ((bitField0_ & 0x00001000) != 0);
    }
    /**
     * <pre>
     * Specific gravity.
     * </pre>
     *
     * <code>optional double specific_gravity = 13;</code>
     * @return The specificGravity.
     */
    @java.lang.Override
    public double getSpecificGravity() {
      return specificGravity_;
    }

    public static final int UNTAPPD_ID_FIELD_NUMBER = 14;
    private volatile java.lang.Object untappdId_;
    /**
     * <pre>
     * Untappd id (for beers only).
     * </pre>
     *
     * <code>optional string untappd_id = 14;</code>
     * @return Whether the untappdId field is set.
     */
    @java.lang.Override
    public boolean hasUntappdId() {
      return ((bitField0_ & 0x00002000) != 0);
    }
    /**
     * <pre>
     * Untappd id (for beers only).
     * </pre>
     *
     * <code>optional string untappd_id = 14;</code>
     * @return The untappdId.
     */
    @java.lang.Override
    public java.lang.String getUntappdId() {
      java.lang.Object ref = untappdId_;
      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()) {
          untappdId_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * Untappd id (for beers only).
     * </pre>
     *
     * <code>optional string untappd_id = 14;</code>
     * @return The bytes for untappdId.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getUntappdIdBytes() {
      java.lang.Object ref = untappdId_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        untappdId_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int BEVERAGE_BACKEND_FIELD_NUMBER = 15;
    private volatile java.lang.Object beverageBackend_;
    /**
     * <pre>
     * Beverage backend.
     * </pre>
     *
     * <code>optional string beverage_backend = 15;</code>
     * @return Whether the beverageBackend field is set.
     */
    @java.lang.Override
    public boolean hasBeverageBackend() {
      return ((bitField0_ & 0x00004000) != 0);
    }
    /**
     * <pre>
     * Beverage backend.
     * </pre>
     *
     * <code>optional string beverage_backend = 15;</code>
     * @return The beverageBackend.
     */
    @java.lang.Override
    public java.lang.String getBeverageBackend() {
      java.lang.Object ref = beverageBackend_;
      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()) {
          beverageBackend_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * Beverage backend.
     * </pre>
     *
     * <code>optional string beverage_backend = 15;</code>
     * @return The bytes for beverageBackend.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getBeverageBackendBytes() {
      java.lang.Object ref = beverageBackend_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        beverageBackend_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int BEVERAGE_BACKEND_ID_FIELD_NUMBER = 16;
    private volatile java.lang.Object beverageBackendId_;
    /**
     * <pre>
     * Id within beverage backend.
     * </pre>
     *
     * <code>optional string beverage_backend_id = 16;</code>
     * @return Whether the beverageBackendId field is set.
     */
    @java.lang.Override
    public boolean hasBeverageBackendId() {
      return ((bitField0_ & 0x00008000) != 0);
    }
    /**
     * <pre>
     * Id within beverage backend.
     * </pre>
     *
     * <code>optional string beverage_backend_id = 16;</code>
     * @return The beverageBackendId.
     */
    @java.lang.Override
    public java.lang.String getBeverageBackendId() {
      java.lang.Object ref = beverageBackendId_;
      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()) {
          beverageBackendId_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * Id within beverage backend.
     * </pre>
     *
     * <code>optional string beverage_backend_id = 16;</code>
     * @return The bytes for beverageBackendId.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getBeverageBackendIdBytes() {
      java.lang.Object ref = beverageBackendId_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        beverageBackendId_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int COLOR_HEX_FIELD_NUMBER = 17;
    private volatile java.lang.Object colorHex_;
    /**
     * <code>optional string color_hex = 17;</code>
     * @return Whether the colorHex field is set.
     */
    @java.lang.Override
    public boolean hasColorHex() {
      return ((bitField0_ & 0x00010000) != 0);
    }
    /**
     * <code>optional string color_hex = 17;</code>
     * @return The colorHex.
     */
    @java.lang.Override
    public java.lang.String getColorHex() {
      java.lang.Object ref = colorHex_;
      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()) {
          colorHex_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string color_hex = 17;</code>
     * @return The bytes for colorHex.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getColorHexBytes() {
      java.lang.Object ref = colorHex_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        colorHex_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int SRM_FIELD_NUMBER = 18;
    private double srm_;
    /**
     * <code>optional double srm = 18;</code>
     * @return Whether the srm field is set.
     */
    @java.lang.Override
    public boolean hasSrm() {
      return ((bitField0_ & 0x00020000) != 0);
    }
    /**
     * <code>optional double srm = 18;</code>
     * @return The srm.
     */
    @java.lang.Override
    public double getSrm() {
      return srm_;
    }

    public static final int IBU_FIELD_NUMBER = 19;
    private double ibu_;
    /**
     * <code>optional double ibu = 19;</code>
     * @return Whether the ibu field is set.
     */
    @java.lang.Override
    public boolean hasIbu() {
      return ((bitField0_ & 0x00040000) != 0);
    }
    /**
     * <code>optional double ibu = 19;</code>
     * @return The ibu.
     */
    @java.lang.Override
    public double getIbu() {
      return ibu_;
    }

    public static final int STAR_RATING_FIELD_NUMBER = 20;
    private double starRating_;
    /**
     * <code>optional double star_rating = 20;</code>
     * @return Whether the starRating field is set.
     */
    @java.lang.Override
    public boolean hasStarRating() {
      return ((bitField0_ & 0x00080000) != 0);
    }
    /**
     * <code>optional double star_rating = 20;</code>
     * @return The starRating.
     */
    @java.lang.Override
    public double getStarRating() {
      return starRating_;
    }

    public static org.kegbot.proto.Models.Beverage parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.Beverage parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.Beverage parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.Beverage parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.Beverage parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.Beverage parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.Beverage parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.Beverage 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 org.kegbot.proto.Models.Beverage parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.Beverage 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 org.kegbot.proto.Models.Beverage parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.Beverage 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(org.kegbot.proto.Models.Beverage 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 type of beer, coffee, wine, or other beverage.
     * </pre>
     *
     * Protobuf type {@code Beverage}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:Beverage)
        org.kegbot.proto.Models.BeverageOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return org.kegbot.proto.Models.internal_static_Beverage_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return org.kegbot.proto.Models.internal_static_Beverage_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                org.kegbot.proto.Models.Beverage.class, org.kegbot.proto.Models.Beverage.Builder.class);
      }

      // Construct using org.kegbot.proto.Models.Beverage.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();
          getPictureFieldBuilder();
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        id_ = 0;
        bitField0_ = (bitField0_ & ~0x00000001);
        name_ = "";
        bitField0_ = (bitField0_ & ~0x00000002);
        if (producerBuilder_ == null) {
          producer_ = null;
        } else {
          producerBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000004);
        beverageType_ = "";
        bitField0_ = (bitField0_ & ~0x00000008);
        style_ = "";
        bitField0_ = (bitField0_ & ~0x00000010);
        description_ = "";
        bitField0_ = (bitField0_ & ~0x00000020);
        if (pictureBuilder_ == null) {
          picture_ = null;
        } else {
          pictureBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000040);
        vintageYear_ = 0;
        bitField0_ = (bitField0_ & ~0x00000080);
        abvPercent_ = 0D;
        bitField0_ = (bitField0_ & ~0x00000100);
        caloriesPerMl_ = 0D;
        bitField0_ = (bitField0_ & ~0x00000200);
        carbsPerMl_ = 0D;
        bitField0_ = (bitField0_ & ~0x00000400);
        originalGravity_ = 0D;
        bitField0_ = (bitField0_ & ~0x00000800);
        specificGravity_ = 0D;
        bitField0_ = (bitField0_ & ~0x00001000);
        untappdId_ = "";
        bitField0_ = (bitField0_ & ~0x00002000);
        beverageBackend_ = "";
        bitField0_ = (bitField0_ & ~0x00004000);
        beverageBackendId_ = "";
        bitField0_ = (bitField0_ & ~0x00008000);
        colorHex_ = "";
        bitField0_ = (bitField0_ & ~0x00010000);
        srm_ = 0D;
        bitField0_ = (bitField0_ & ~0x00020000);
        ibu_ = 0D;
        bitField0_ = (bitField0_ & ~0x00040000);
        starRating_ = 0D;
        bitField0_ = (bitField0_ & ~0x00080000);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return org.kegbot.proto.Models.internal_static_Beverage_descriptor;
      }

      @java.lang.Override
      public org.kegbot.proto.Models.Beverage getDefaultInstanceForType() {
        return org.kegbot.proto.Models.Beverage.getDefaultInstance();
      }

      @java.lang.Override
      public org.kegbot.proto.Models.Beverage build() {
        org.kegbot.proto.Models.Beverage result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public org.kegbot.proto.Models.Beverage buildPartial() {
        org.kegbot.proto.Models.Beverage result = new org.kegbot.proto.Models.Beverage(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)) {
          to_bitField0_ |= 0x00000002;
        }
        result.name_ = name_;
        if (((from_bitField0_ & 0x00000004) != 0)) {
          if (producerBuilder_ == null) {
            result.producer_ = producer_;
          } else {
            result.producer_ = producerBuilder_.build();
          }
          to_bitField0_ |= 0x00000004;
        }
        if (((from_bitField0_ & 0x00000008) != 0)) {
          to_bitField0_ |= 0x00000008;
        }
        result.beverageType_ = beverageType_;
        if (((from_bitField0_ & 0x00000010) != 0)) {
          to_bitField0_ |= 0x00000010;
        }
        result.style_ = style_;
        if (((from_bitField0_ & 0x00000020) != 0)) {
          to_bitField0_ |= 0x00000020;
        }
        result.description_ = description_;
        if (((from_bitField0_ & 0x00000040) != 0)) {
          if (pictureBuilder_ == null) {
            result.picture_ = picture_;
          } else {
            result.picture_ = pictureBuilder_.build();
          }
          to_bitField0_ |= 0x00000040;
        }
        if (((from_bitField0_ & 0x00000080) != 0)) {
          result.vintageYear_ = vintageYear_;
          to_bitField0_ |= 0x00000080;
        }
        if (((from_bitField0_ & 0x00000100) != 0)) {
          result.abvPercent_ = abvPercent_;
          to_bitField0_ |= 0x00000100;
        }
        if (((from_bitField0_ & 0x00000200) != 0)) {
          result.caloriesPerMl_ = caloriesPerMl_;
          to_bitField0_ |= 0x00000200;
        }
        if (((from_bitField0_ & 0x00000400) != 0)) {
          result.carbsPerMl_ = carbsPerMl_;
          to_bitField0_ |= 0x00000400;
        }
        if (((from_bitField0_ & 0x00000800) != 0)) {
          result.originalGravity_ = originalGravity_;
          to_bitField0_ |= 0x00000800;
        }
        if (((from_bitField0_ & 0x00001000) != 0)) {
          result.specificGravity_ = specificGravity_;
          to_bitField0_ |= 0x00001000;
        }
        if (((from_bitField0_ & 0x00002000) != 0)) {
          to_bitField0_ |= 0x00002000;
        }
        result.untappdId_ = untappdId_;
        if (((from_bitField0_ & 0x00004000) != 0)) {
          to_bitField0_ |= 0x00004000;
        }
        result.beverageBackend_ = beverageBackend_;
        if (((from_bitField0_ & 0x00008000) != 0)) {
          to_bitField0_ |= 0x00008000;
        }
        result.beverageBackendId_ = beverageBackendId_;
        if (((from_bitField0_ & 0x00010000) != 0)) {
          to_bitField0_ |= 0x00010000;
        }
        result.colorHex_ = colorHex_;
        if (((from_bitField0_ & 0x00020000) != 0)) {
          result.srm_ = srm_;
          to_bitField0_ |= 0x00020000;
        }
        if (((from_bitField0_ & 0x00040000) != 0)) {
          result.ibu_ = ibu_;
          to_bitField0_ |= 0x00040000;
        }
        if (((from_bitField0_ & 0x00080000) != 0)) {
          result.starRating_ = starRating_;
          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);
      }
      private int bitField0_;

      private int id_ ;
      /**
       * <pre>
       * Unique id for this beverage.
       * </pre>
       *
       * <code>required uint32 id = 1;</code>
       * @return Whether the id field is set.
       */
      @java.lang.Override
      public boolean hasId() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <pre>
       * Unique id for this beverage.
       * </pre>
       *
       * <code>required uint32 id = 1;</code>
       * @return The id.
       */
      @java.lang.Override
      public int getId() {
        return id_;
      }
      /**
       * <pre>
       * Unique id for this beverage.
       * </pre>
       *
       * <code>required uint32 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 id for this beverage.
       * </pre>
       *
       * <code>required uint32 id = 1;</code>
       * @return This builder for chaining.
       */
      public Builder clearId() {
        bitField0_ = (bitField0_ & ~0x00000001);
        id_ = 0;
        onChanged();
        return this;
      }

      private java.lang.Object name_ = "";
      /**
       * <pre>
       * Beverage name.
       * </pre>
       *
       * <code>required string name = 2;</code>
       * @return Whether the name field is set.
       */
      public boolean hasName() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <pre>
       * Beverage name.
       * </pre>
       *
       * <code>required 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>
       * Beverage name.
       * </pre>
       *
       * <code>required 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>
       * Beverage name.
       * </pre>
       *
       * <code>required 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>
       * Beverage name.
       * </pre>
       *
       * <code>required string name = 2;</code>
       * @return This builder for chaining.
       */
      public Builder clearName() {
        bitField0_ = (bitField0_ & ~0x00000002);
        name_ = getDefaultInstance().getName();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Beverage name.
       * </pre>
       *
       * <code>required 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 org.kegbot.proto.Models.BeverageProducer producer_;
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.BeverageProducer, org.kegbot.proto.Models.BeverageProducer.Builder, org.kegbot.proto.Models.BeverageProducerOrBuilder> producerBuilder_;
      /**
       * <pre>
       * Producer.
       * </pre>
       *
       * <code>required .BeverageProducer producer = 3;</code>
       * @return Whether the producer field is set.
       */
      public boolean hasProducer() {
        return ((bitField0_ & 0x00000004) != 0);
      }
      /**
       * <pre>
       * Producer.
       * </pre>
       *
       * <code>required .BeverageProducer producer = 3;</code>
       * @return The producer.
       */
      public org.kegbot.proto.Models.BeverageProducer getProducer() {
        if (producerBuilder_ == null) {
          return producer_ == null ? org.kegbot.proto.Models.BeverageProducer.getDefaultInstance() : producer_;
        } else {
          return producerBuilder_.getMessage();
        }
      }
      /**
       * <pre>
       * Producer.
       * </pre>
       *
       * <code>required .BeverageProducer producer = 3;</code>
       */
      public Builder setProducer(org.kegbot.proto.Models.BeverageProducer value) {
        if (producerBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          producer_ = value;
          onChanged();
        } else {
          producerBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000004;
        return this;
      }
      /**
       * <pre>
       * Producer.
       * </pre>
       *
       * <code>required .BeverageProducer producer = 3;</code>
       */
      public Builder setProducer(
          org.kegbot.proto.Models.BeverageProducer.Builder builderForValue) {
        if (producerBuilder_ == null) {
          producer_ = builderForValue.build();
          onChanged();
        } else {
          producerBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000004;
        return this;
      }
      /**
       * <pre>
       * Producer.
       * </pre>
       *
       * <code>required .BeverageProducer producer = 3;</code>
       */
      public Builder mergeProducer(org.kegbot.proto.Models.BeverageProducer value) {
        if (producerBuilder_ == null) {
          if (((bitField0_ & 0x00000004) != 0) &&
              producer_ != null &&
              producer_ != org.kegbot.proto.Models.BeverageProducer.getDefaultInstance()) {
            producer_ =
              org.kegbot.proto.Models.BeverageProducer.newBuilder(producer_).mergeFrom(value).buildPartial();
          } else {
            producer_ = value;
          }
          onChanged();
        } else {
          producerBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000004;
        return this;
      }
      /**
       * <pre>
       * Producer.
       * </pre>
       *
       * <code>required .BeverageProducer producer = 3;</code>
       */
      public Builder clearProducer() {
        if (producerBuilder_ == null) {
          producer_ = null;
          onChanged();
        } else {
          producerBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000004);
        return this;
      }
      /**
       * <pre>
       * Producer.
       * </pre>
       *
       * <code>required .BeverageProducer producer = 3;</code>
       */
      public org.kegbot.proto.Models.BeverageProducer.Builder getProducerBuilder() {
        bitField0_ |= 0x00000004;
        onChanged();
        return getProducerFieldBuilder().getBuilder();
      }
      /**
       * <pre>
       * Producer.
       * </pre>
       *
       * <code>required .BeverageProducer producer = 3;</code>
       */
      public org.kegbot.proto.Models.BeverageProducerOrBuilder getProducerOrBuilder() {
        if (producerBuilder_ != null) {
          return producerBuilder_.getMessageOrBuilder();
        } else {
          return producer_ == null ?
              org.kegbot.proto.Models.BeverageProducer.getDefaultInstance() : producer_;
        }
      }
      /**
       * <pre>
       * Producer.
       * </pre>
       *
       * <code>required .BeverageProducer producer = 3;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.BeverageProducer, org.kegbot.proto.Models.BeverageProducer.Builder, org.kegbot.proto.Models.BeverageProducerOrBuilder> 
          getProducerFieldBuilder() {
        if (producerBuilder_ == null) {
          producerBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              org.kegbot.proto.Models.BeverageProducer, org.kegbot.proto.Models.BeverageProducer.Builder, org.kegbot.proto.Models.BeverageProducerOrBuilder>(
                  getProducer(),
                  getParentForChildren(),
                  isClean());
          producer_ = null;
        }
        return producerBuilder_;
      }

      private java.lang.Object beverageType_ = "";
      /**
       * <pre>
       * Type of beverage.
       * </pre>
       *
       * <code>required string beverage_type = 4;</code>
       * @return Whether the beverageType field is set.
       */
      public boolean hasBeverageType() {
        return ((bitField0_ & 0x00000008) != 0);
      }
      /**
       * <pre>
       * Type of beverage.
       * </pre>
       *
       * <code>required string beverage_type = 4;</code>
       * @return The beverageType.
       */
      public java.lang.String getBeverageType() {
        java.lang.Object ref = beverageType_;
        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()) {
            beverageType_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * Type of beverage.
       * </pre>
       *
       * <code>required string beverage_type = 4;</code>
       * @return The bytes for beverageType.
       */
      public com.google.protobuf.ByteString
          getBeverageTypeBytes() {
        java.lang.Object ref = beverageType_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          beverageType_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * Type of beverage.
       * </pre>
       *
       * <code>required string beverage_type = 4;</code>
       * @param value The beverageType to set.
       * @return This builder for chaining.
       */
      public Builder setBeverageType(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
        beverageType_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Type of beverage.
       * </pre>
       *
       * <code>required string beverage_type = 4;</code>
       * @return This builder for chaining.
       */
      public Builder clearBeverageType() {
        bitField0_ = (bitField0_ & ~0x00000008);
        beverageType_ = getDefaultInstance().getBeverageType();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Type of beverage.
       * </pre>
       *
       * <code>required string beverage_type = 4;</code>
       * @param value The bytes for beverageType to set.
       * @return This builder for chaining.
       */
      public Builder setBeverageTypeBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
        beverageType_ = value;
        onChanged();
        return this;
      }

      private java.lang.Object style_ = "";
      /**
       * <pre>
       * Beverage style.
       * </pre>
       *
       * <code>optional string style = 5;</code>
       * @return Whether the style field is set.
       */
      public boolean hasStyle() {
        return ((bitField0_ & 0x00000010) != 0);
      }
      /**
       * <pre>
       * Beverage style.
       * </pre>
       *
       * <code>optional string style = 5;</code>
       * @return The style.
       */
      public java.lang.String getStyle() {
        java.lang.Object ref = style_;
        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()) {
            style_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * Beverage style.
       * </pre>
       *
       * <code>optional string style = 5;</code>
       * @return The bytes for style.
       */
      public com.google.protobuf.ByteString
          getStyleBytes() {
        java.lang.Object ref = style_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          style_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * Beverage style.
       * </pre>
       *
       * <code>optional string style = 5;</code>
       * @param value The style to set.
       * @return This builder for chaining.
       */
      public Builder setStyle(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
        style_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Beverage style.
       * </pre>
       *
       * <code>optional string style = 5;</code>
       * @return This builder for chaining.
       */
      public Builder clearStyle() {
        bitField0_ = (bitField0_ & ~0x00000010);
        style_ = getDefaultInstance().getStyle();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Beverage style.
       * </pre>
       *
       * <code>optional string style = 5;</code>
       * @param value The bytes for style to set.
       * @return This builder for chaining.
       */
      public Builder setStyleBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
        style_ = value;
        onChanged();
        return this;
      }

      private java.lang.Object description_ = "";
      /**
       * <pre>
       * Free-form description.
       * </pre>
       *
       * <code>optional string description = 6;</code>
       * @return Whether the description field is set.
       */
      public boolean hasDescription() {
        return ((bitField0_ & 0x00000020) != 0);
      }
      /**
       * <pre>
       * Free-form description.
       * </pre>
       *
       * <code>optional string description = 6;</code>
       * @return The description.
       */
      public java.lang.String getDescription() {
        java.lang.Object ref = description_;
        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()) {
            description_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * Free-form description.
       * </pre>
       *
       * <code>optional string description = 6;</code>
       * @return The bytes for description.
       */
      public com.google.protobuf.ByteString
          getDescriptionBytes() {
        java.lang.Object ref = description_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          description_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * Free-form description.
       * </pre>
       *
       * <code>optional string description = 6;</code>
       * @param value The description to set.
       * @return This builder for chaining.
       */
      public Builder setDescription(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000020;
        description_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Free-form description.
       * </pre>
       *
       * <code>optional string description = 6;</code>
       * @return This builder for chaining.
       */
      public Builder clearDescription() {
        bitField0_ = (bitField0_ & ~0x00000020);
        description_ = getDefaultInstance().getDescription();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Free-form description.
       * </pre>
       *
       * <code>optional string description = 6;</code>
       * @param value The bytes for description to set.
       * @return This builder for chaining.
       */
      public Builder setDescriptionBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000020;
        description_ = value;
        onChanged();
        return this;
      }

      private org.kegbot.proto.Models.Image picture_;
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.Image, org.kegbot.proto.Models.Image.Builder, org.kegbot.proto.Models.ImageOrBuilder> pictureBuilder_;
      /**
       * <pre>
       * Logo or other image.
       * </pre>
       *
       * <code>optional .Image picture = 7;</code>
       * @return Whether the picture field is set.
       */
      public boolean hasPicture() {
        return ((bitField0_ & 0x00000040) != 0);
      }
      /**
       * <pre>
       * Logo or other image.
       * </pre>
       *
       * <code>optional .Image picture = 7;</code>
       * @return The picture.
       */
      public org.kegbot.proto.Models.Image getPicture() {
        if (pictureBuilder_ == null) {
          return picture_ == null ? org.kegbot.proto.Models.Image.getDefaultInstance() : picture_;
        } else {
          return pictureBuilder_.getMessage();
        }
      }
      /**
       * <pre>
       * Logo or other image.
       * </pre>
       *
       * <code>optional .Image picture = 7;</code>
       */
      public Builder setPicture(org.kegbot.proto.Models.Image value) {
        if (pictureBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          picture_ = value;
          onChanged();
        } else {
          pictureBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000040;
        return this;
      }
      /**
       * <pre>
       * Logo or other image.
       * </pre>
       *
       * <code>optional .Image picture = 7;</code>
       */
      public Builder setPicture(
          org.kegbot.proto.Models.Image.Builder builderForValue) {
        if (pictureBuilder_ == null) {
          picture_ = builderForValue.build();
          onChanged();
        } else {
          pictureBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000040;
        return this;
      }
      /**
       * <pre>
       * Logo or other image.
       * </pre>
       *
       * <code>optional .Image picture = 7;</code>
       */
      public Builder mergePicture(org.kegbot.proto.Models.Image value) {
        if (pictureBuilder_ == null) {
          if (((bitField0_ & 0x00000040) != 0) &&
              picture_ != null &&
              picture_ != org.kegbot.proto.Models.Image.getDefaultInstance()) {
            picture_ =
              org.kegbot.proto.Models.Image.newBuilder(picture_).mergeFrom(value).buildPartial();
          } else {
            picture_ = value;
          }
          onChanged();
        } else {
          pictureBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000040;
        return this;
      }
      /**
       * <pre>
       * Logo or other image.
       * </pre>
       *
       * <code>optional .Image picture = 7;</code>
       */
      public Builder clearPicture() {
        if (pictureBuilder_ == null) {
          picture_ = null;
          onChanged();
        } else {
          pictureBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000040);
        return this;
      }
      /**
       * <pre>
       * Logo or other image.
       * </pre>
       *
       * <code>optional .Image picture = 7;</code>
       */
      public org.kegbot.proto.Models.Image.Builder getPictureBuilder() {
        bitField0_ |= 0x00000040;
        onChanged();
        return getPictureFieldBuilder().getBuilder();
      }
      /**
       * <pre>
       * Logo or other image.
       * </pre>
       *
       * <code>optional .Image picture = 7;</code>
       */
      public org.kegbot.proto.Models.ImageOrBuilder getPictureOrBuilder() {
        if (pictureBuilder_ != null) {
          return pictureBuilder_.getMessageOrBuilder();
        } else {
          return picture_ == null ?
              org.kegbot.proto.Models.Image.getDefaultInstance() : picture_;
        }
      }
      /**
       * <pre>
       * Logo or other image.
       * </pre>
       *
       * <code>optional .Image picture = 7;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.Image, org.kegbot.proto.Models.Image.Builder, org.kegbot.proto.Models.ImageOrBuilder> 
          getPictureFieldBuilder() {
        if (pictureBuilder_ == null) {
          pictureBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              org.kegbot.proto.Models.Image, org.kegbot.proto.Models.Image.Builder, org.kegbot.proto.Models.ImageOrBuilder>(
                  getPicture(),
                  getParentForChildren(),
                  isClean());
          picture_ = null;
        }
        return pictureBuilder_;
      }

      private int vintageYear_ ;
      /**
       * <pre>
       * Vintage.
       * </pre>
       *
       * <code>optional uint32 vintage_year = 8;</code>
       * @return Whether the vintageYear field is set.
       */
      @java.lang.Override
      public boolean hasVintageYear() {
        return ((bitField0_ & 0x00000080) != 0);
      }
      /**
       * <pre>
       * Vintage.
       * </pre>
       *
       * <code>optional uint32 vintage_year = 8;</code>
       * @return The vintageYear.
       */
      @java.lang.Override
      public int getVintageYear() {
        return vintageYear_;
      }
      /**
       * <pre>
       * Vintage.
       * </pre>
       *
       * <code>optional uint32 vintage_year = 8;</code>
       * @param value The vintageYear to set.
       * @return This builder for chaining.
       */
      public Builder setVintageYear(int value) {
        bitField0_ |= 0x00000080;
        vintageYear_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Vintage.
       * </pre>
       *
       * <code>optional uint32 vintage_year = 8;</code>
       * @return This builder for chaining.
       */
      public Builder clearVintageYear() {
        bitField0_ = (bitField0_ & ~0x00000080);
        vintageYear_ = 0;
        onChanged();
        return this;
      }

      private double abvPercent_ ;
      /**
       * <pre>
       * Alcohol by volume (0.0-100.0).
       * </pre>
       *
       * <code>optional double abv_percent = 9;</code>
       * @return Whether the abvPercent field is set.
       */
      @java.lang.Override
      public boolean hasAbvPercent() {
        return ((bitField0_ & 0x00000100) != 0);
      }
      /**
       * <pre>
       * Alcohol by volume (0.0-100.0).
       * </pre>
       *
       * <code>optional double abv_percent = 9;</code>
       * @return The abvPercent.
       */
      @java.lang.Override
      public double getAbvPercent() {
        return abvPercent_;
      }
      /**
       * <pre>
       * Alcohol by volume (0.0-100.0).
       * </pre>
       *
       * <code>optional double abv_percent = 9;</code>
       * @param value The abvPercent to set.
       * @return This builder for chaining.
       */
      public Builder setAbvPercent(double value) {
        bitField0_ |= 0x00000100;
        abvPercent_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Alcohol by volume (0.0-100.0).
       * </pre>
       *
       * <code>optional double abv_percent = 9;</code>
       * @return This builder for chaining.
       */
      public Builder clearAbvPercent() {
        bitField0_ = (bitField0_ & ~0x00000100);
        abvPercent_ = 0D;
        onChanged();
        return this;
      }

      private double caloriesPerMl_ ;
      /**
       * <pre>
       * Calories.
       * </pre>
       *
       * <code>optional double calories_per_ml = 10;</code>
       * @return Whether the caloriesPerMl field is set.
       */
      @java.lang.Override
      public boolean hasCaloriesPerMl() {
        return ((bitField0_ & 0x00000200) != 0);
      }
      /**
       * <pre>
       * Calories.
       * </pre>
       *
       * <code>optional double calories_per_ml = 10;</code>
       * @return The caloriesPerMl.
       */
      @java.lang.Override
      public double getCaloriesPerMl() {
        return caloriesPerMl_;
      }
      /**
       * <pre>
       * Calories.
       * </pre>
       *
       * <code>optional double calories_per_ml = 10;</code>
       * @param value The caloriesPerMl to set.
       * @return This builder for chaining.
       */
      public Builder setCaloriesPerMl(double value) {
        bitField0_ |= 0x00000200;
        caloriesPerMl_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Calories.
       * </pre>
       *
       * <code>optional double calories_per_ml = 10;</code>
       * @return This builder for chaining.
       */
      public Builder clearCaloriesPerMl() {
        bitField0_ = (bitField0_ & ~0x00000200);
        caloriesPerMl_ = 0D;
        onChanged();
        return this;
      }

      private double carbsPerMl_ ;
      /**
       * <pre>
       * Carbohydrates.
       * </pre>
       *
       * <code>optional double carbs_per_ml = 11;</code>
       * @return Whether the carbsPerMl field is set.
       */
      @java.lang.Override
      public boolean hasCarbsPerMl() {
        return ((bitField0_ & 0x00000400) != 0);
      }
      /**
       * <pre>
       * Carbohydrates.
       * </pre>
       *
       * <code>optional double carbs_per_ml = 11;</code>
       * @return The carbsPerMl.
       */
      @java.lang.Override
      public double getCarbsPerMl() {
        return carbsPerMl_;
      }
      /**
       * <pre>
       * Carbohydrates.
       * </pre>
       *
       * <code>optional double carbs_per_ml = 11;</code>
       * @param value The carbsPerMl to set.
       * @return This builder for chaining.
       */
      public Builder setCarbsPerMl(double value) {
        bitField0_ |= 0x00000400;
        carbsPerMl_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Carbohydrates.
       * </pre>
       *
       * <code>optional double carbs_per_ml = 11;</code>
       * @return This builder for chaining.
       */
      public Builder clearCarbsPerMl() {
        bitField0_ = (bitField0_ & ~0x00000400);
        carbsPerMl_ = 0D;
        onChanged();
        return this;
      }

      private double originalGravity_ ;
      /**
       * <pre>
       * Original gravity.
       * </pre>
       *
       * <code>optional double original_gravity = 12;</code>
       * @return Whether the originalGravity field is set.
       */
      @java.lang.Override
      public boolean hasOriginalGravity() {
        return ((bitField0_ & 0x00000800) != 0);
      }
      /**
       * <pre>
       * Original gravity.
       * </pre>
       *
       * <code>optional double original_gravity = 12;</code>
       * @return The originalGravity.
       */
      @java.lang.Override
      public double getOriginalGravity() {
        return originalGravity_;
      }
      /**
       * <pre>
       * Original gravity.
       * </pre>
       *
       * <code>optional double original_gravity = 12;</code>
       * @param value The originalGravity to set.
       * @return This builder for chaining.
       */
      public Builder setOriginalGravity(double value) {
        bitField0_ |= 0x00000800;
        originalGravity_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Original gravity.
       * </pre>
       *
       * <code>optional double original_gravity = 12;</code>
       * @return This builder for chaining.
       */
      public Builder clearOriginalGravity() {
        bitField0_ = (bitField0_ & ~0x00000800);
        originalGravity_ = 0D;
        onChanged();
        return this;
      }

      private double specificGravity_ ;
      /**
       * <pre>
       * Specific gravity.
       * </pre>
       *
       * <code>optional double specific_gravity = 13;</code>
       * @return Whether the specificGravity field is set.
       */
      @java.lang.Override
      public boolean hasSpecificGravity() {
        return ((bitField0_ & 0x00001000) != 0);
      }
      /**
       * <pre>
       * Specific gravity.
       * </pre>
       *
       * <code>optional double specific_gravity = 13;</code>
       * @return The specificGravity.
       */
      @java.lang.Override
      public double getSpecificGravity() {
        return specificGravity_;
      }
      /**
       * <pre>
       * Specific gravity.
       * </pre>
       *
       * <code>optional double specific_gravity = 13;</code>
       * @param value The specificGravity to set.
       * @return This builder for chaining.
       */
      public Builder setSpecificGravity(double value) {
        bitField0_ |= 0x00001000;
        specificGravity_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Specific gravity.
       * </pre>
       *
       * <code>optional double specific_gravity = 13;</code>
       * @return This builder for chaining.
       */
      public Builder clearSpecificGravity() {
        bitField0_ = (bitField0_ & ~0x00001000);
        specificGravity_ = 0D;
        onChanged();
        return this;
      }

      private java.lang.Object untappdId_ = "";
      /**
       * <pre>
       * Untappd id (for beers only).
       * </pre>
       *
       * <code>optional string untappd_id = 14;</code>
       * @return Whether the untappdId field is set.
       */
      public boolean hasUntappdId() {
        return ((bitField0_ & 0x00002000) != 0);
      }
      /**
       * <pre>
       * Untappd id (for beers only).
       * </pre>
       *
       * <code>optional string untappd_id = 14;</code>
       * @return The untappdId.
       */
      public java.lang.String getUntappdId() {
        java.lang.Object ref = untappdId_;
        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()) {
            untappdId_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * Untappd id (for beers only).
       * </pre>
       *
       * <code>optional string untappd_id = 14;</code>
       * @return The bytes for untappdId.
       */
      public com.google.protobuf.ByteString
          getUntappdIdBytes() {
        java.lang.Object ref = untappdId_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          untappdId_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * Untappd id (for beers only).
       * </pre>
       *
       * <code>optional string untappd_id = 14;</code>
       * @param value The untappdId to set.
       * @return This builder for chaining.
       */
      public Builder setUntappdId(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00002000;
        untappdId_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Untappd id (for beers only).
       * </pre>
       *
       * <code>optional string untappd_id = 14;</code>
       * @return This builder for chaining.
       */
      public Builder clearUntappdId() {
        bitField0_ = (bitField0_ & ~0x00002000);
        untappdId_ = getDefaultInstance().getUntappdId();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Untappd id (for beers only).
       * </pre>
       *
       * <code>optional string untappd_id = 14;</code>
       * @param value The bytes for untappdId to set.
       * @return This builder for chaining.
       */
      public Builder setUntappdIdBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00002000;
        untappdId_ = value;
        onChanged();
        return this;
      }

      private java.lang.Object beverageBackend_ = "";
      /**
       * <pre>
       * Beverage backend.
       * </pre>
       *
       * <code>optional string beverage_backend = 15;</code>
       * @return Whether the beverageBackend field is set.
       */
      public boolean hasBeverageBackend() {
        return ((bitField0_ & 0x00004000) != 0);
      }
      /**
       * <pre>
       * Beverage backend.
       * </pre>
       *
       * <code>optional string beverage_backend = 15;</code>
       * @return The beverageBackend.
       */
      public java.lang.String getBeverageBackend() {
        java.lang.Object ref = beverageBackend_;
        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()) {
            beverageBackend_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * Beverage backend.
       * </pre>
       *
       * <code>optional string beverage_backend = 15;</code>
       * @return The bytes for beverageBackend.
       */
      public com.google.protobuf.ByteString
          getBeverageBackendBytes() {
        java.lang.Object ref = beverageBackend_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          beverageBackend_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * Beverage backend.
       * </pre>
       *
       * <code>optional string beverage_backend = 15;</code>
       * @param value The beverageBackend to set.
       * @return This builder for chaining.
       */
      public Builder setBeverageBackend(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00004000;
        beverageBackend_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Beverage backend.
       * </pre>
       *
       * <code>optional string beverage_backend = 15;</code>
       * @return This builder for chaining.
       */
      public Builder clearBeverageBackend() {
        bitField0_ = (bitField0_ & ~0x00004000);
        beverageBackend_ = getDefaultInstance().getBeverageBackend();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Beverage backend.
       * </pre>
       *
       * <code>optional string beverage_backend = 15;</code>
       * @param value The bytes for beverageBackend to set.
       * @return This builder for chaining.
       */
      public Builder setBeverageBackendBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00004000;
        beverageBackend_ = value;
        onChanged();
        return this;
      }

      private java.lang.Object beverageBackendId_ = "";
      /**
       * <pre>
       * Id within beverage backend.
       * </pre>
       *
       * <code>optional string beverage_backend_id = 16;</code>
       * @return Whether the beverageBackendId field is set.
       */
      public boolean hasBeverageBackendId() {
        return ((bitField0_ & 0x00008000) != 0);
      }
      /**
       * <pre>
       * Id within beverage backend.
       * </pre>
       *
       * <code>optional string beverage_backend_id = 16;</code>
       * @return The beverageBackendId.
       */
      public java.lang.String getBeverageBackendId() {
        java.lang.Object ref = beverageBackendId_;
        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()) {
            beverageBackendId_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * Id within beverage backend.
       * </pre>
       *
       * <code>optional string beverage_backend_id = 16;</code>
       * @return The bytes for beverageBackendId.
       */
      public com.google.protobuf.ByteString
          getBeverageBackendIdBytes() {
        java.lang.Object ref = beverageBackendId_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          beverageBackendId_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * Id within beverage backend.
       * </pre>
       *
       * <code>optional string beverage_backend_id = 16;</code>
       * @param value The beverageBackendId to set.
       * @return This builder for chaining.
       */
      public Builder setBeverageBackendId(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00008000;
        beverageBackendId_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Id within beverage backend.
       * </pre>
       *
       * <code>optional string beverage_backend_id = 16;</code>
       * @return This builder for chaining.
       */
      public Builder clearBeverageBackendId() {
        bitField0_ = (bitField0_ & ~0x00008000);
        beverageBackendId_ = getDefaultInstance().getBeverageBackendId();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Id within beverage backend.
       * </pre>
       *
       * <code>optional string beverage_backend_id = 16;</code>
       * @param value The bytes for beverageBackendId to set.
       * @return This builder for chaining.
       */
      public Builder setBeverageBackendIdBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00008000;
        beverageBackendId_ = value;
        onChanged();
        return this;
      }

      private java.lang.Object colorHex_ = "";
      /**
       * <code>optional string color_hex = 17;</code>
       * @return Whether the colorHex field is set.
       */
      public boolean hasColorHex() {
        return ((bitField0_ & 0x00010000) != 0);
      }
      /**
       * <code>optional string color_hex = 17;</code>
       * @return The colorHex.
       */
      public java.lang.String getColorHex() {
        java.lang.Object ref = colorHex_;
        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()) {
            colorHex_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string color_hex = 17;</code>
       * @return The bytes for colorHex.
       */
      public com.google.protobuf.ByteString
          getColorHexBytes() {
        java.lang.Object ref = colorHex_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          colorHex_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string color_hex = 17;</code>
       * @param value The colorHex to set.
       * @return This builder for chaining.
       */
      public Builder setColorHex(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00010000;
        colorHex_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string color_hex = 17;</code>
       * @return This builder for chaining.
       */
      public Builder clearColorHex() {
        bitField0_ = (bitField0_ & ~0x00010000);
        colorHex_ = getDefaultInstance().getColorHex();
        onChanged();
        return this;
      }
      /**
       * <code>optional string color_hex = 17;</code>
       * @param value The bytes for colorHex to set.
       * @return This builder for chaining.
       */
      public Builder setColorHexBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00010000;
        colorHex_ = value;
        onChanged();
        return this;
      }

      private double srm_ ;
      /**
       * <code>optional double srm = 18;</code>
       * @return Whether the srm field is set.
       */
      @java.lang.Override
      public boolean hasSrm() {
        return ((bitField0_ & 0x00020000) != 0);
      }
      /**
       * <code>optional double srm = 18;</code>
       * @return The srm.
       */
      @java.lang.Override
      public double getSrm() {
        return srm_;
      }
      /**
       * <code>optional double srm = 18;</code>
       * @param value The srm to set.
       * @return This builder for chaining.
       */
      public Builder setSrm(double value) {
        bitField0_ |= 0x00020000;
        srm_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional double srm = 18;</code>
       * @return This builder for chaining.
       */
      public Builder clearSrm() {
        bitField0_ = (bitField0_ & ~0x00020000);
        srm_ = 0D;
        onChanged();
        return this;
      }

      private double ibu_ ;
      /**
       * <code>optional double ibu = 19;</code>
       * @return Whether the ibu field is set.
       */
      @java.lang.Override
      public boolean hasIbu() {
        return ((bitField0_ & 0x00040000) != 0);
      }
      /**
       * <code>optional double ibu = 19;</code>
       * @return The ibu.
       */
      @java.lang.Override
      public double getIbu() {
        return ibu_;
      }
      /**
       * <code>optional double ibu = 19;</code>
       * @param value The ibu to set.
       * @return This builder for chaining.
       */
      public Builder setIbu(double value) {
        bitField0_ |= 0x00040000;
        ibu_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional double ibu = 19;</code>
       * @return This builder for chaining.
       */
      public Builder clearIbu() {
        bitField0_ = (bitField0_ & ~0x00040000);
        ibu_ = 0D;
        onChanged();
        return this;
      }

      private double starRating_ ;
      /**
       * <code>optional double star_rating = 20;</code>
       * @return Whether the starRating field is set.
       */
      @java.lang.Override
      public boolean hasStarRating() {
        return ((bitField0_ & 0x00080000) != 0);
      }
      /**
       * <code>optional double star_rating = 20;</code>
       * @return The starRating.
       */
      @java.lang.Override
      public double getStarRating() {
        return starRating_;
      }
      /**
       * <code>optional double star_rating = 20;</code>
       * @param value The starRating to set.
       * @return This builder for chaining.
       */
      public Builder setStarRating(double value) {
        bitField0_ |= 0x00080000;
        starRating_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional double star_rating = 20;</code>
       * @return This builder for chaining.
       */
      public Builder clearStarRating() {
        bitField0_ = (bitField0_ & ~0x00080000);
        starRating_ = 0D;
        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:Beverage)
    }

    // @@protoc_insertion_point(class_scope:Beverage)
    private static final org.kegbot.proto.Models.Beverage DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new org.kegbot.proto.Models.Beverage();
    }

    public static org.kegbot.proto.Models.Beverage getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

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

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

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

    @java.lang.Override
    public org.kegbot.proto.Models.Beverage getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface BeerStyleOrBuilder extends
      // @@protoc_insertion_point(interface_extends:BeerStyle)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <pre>
     * The unique identifier for this beer style.
     * </pre>
     *
     * <code>required uint32 id = 1;</code>
     * @return Whether the id field is set.
     */
    boolean hasId();
    /**
     * <pre>
     * The unique identifier for this beer style.
     * </pre>
     *
     * <code>required uint32 id = 1;</code>
     * @return The id.
     */
    int getId();

    /**
     * <pre>
     * The name of the beer style.
     * </pre>
     *
     * <code>required string name = 2;</code>
     * @return Whether the name field is set.
     */
    boolean hasName();
    /**
     * <pre>
     * The name of the beer style.
     * </pre>
     *
     * <code>required string name = 2;</code>
     * @return The name.
     */
    java.lang.String getName();
    /**
     * <pre>
     * The name of the beer style.
     * </pre>
     *
     * <code>required string name = 2;</code>
     * @return The bytes for name.
     */
    com.google.protobuf.ByteString
        getNameBytes();
  }
  /**
   * <pre>
   * A named beer style of beer, such as "India Pale Ale".
   * </pre>
   *
   * Protobuf type {@code BeerStyle}
   */
  public static final class BeerStyle extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:BeerStyle)
      BeerStyleOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use BeerStyle.newBuilder() to construct.
    private BeerStyle(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private BeerStyle() {
      name_ = "";
    }

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

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return org.kegbot.proto.Models.internal_static_BeerStyle_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return org.kegbot.proto.Models.internal_static_BeerStyle_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              org.kegbot.proto.Models.BeerStyle.class, org.kegbot.proto.Models.BeerStyle.Builder.class);
    }

    private int bitField0_;
    public static final int ID_FIELD_NUMBER = 1;
    private int id_;
    /**
     * <pre>
     * The unique identifier for this beer style.
     * </pre>
     *
     * <code>required uint32 id = 1;</code>
     * @return Whether the id field is set.
     */
    @java.lang.Override
    public boolean hasId() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <pre>
     * The unique identifier for this beer style.
     * </pre>
     *
     * <code>required uint32 id = 1;</code>
     * @return The id.
     */
    @java.lang.Override
    public int getId() {
      return id_;
    }

    public static final int NAME_FIELD_NUMBER = 2;
    private volatile java.lang.Object name_;
    /**
     * <pre>
     * The name of the beer style.
     * </pre>
     *
     * <code>required string name = 2;</code>
     * @return Whether the name field is set.
     */
    @java.lang.Override
    public boolean hasName() {
      return ((bitField0_ & 0x00000002) != 0);
    }
    /**
     * <pre>
     * The name of the beer style.
     * </pre>
     *
     * <code>required 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>
     * The name of the beer style.
     * </pre>
     *
     * <code>required 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 org.kegbot.proto.Models.BeerStyle parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.BeerStyle parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.BeerStyle parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.BeerStyle parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.BeerStyle parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.BeerStyle parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.BeerStyle parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.BeerStyle 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 org.kegbot.proto.Models.BeerStyle parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.BeerStyle 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 org.kegbot.proto.Models.BeerStyle parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.BeerStyle 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(org.kegbot.proto.Models.BeerStyle 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 named beer style of beer, such as "India Pale Ale".
     * </pre>
     *
     * Protobuf type {@code BeerStyle}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:BeerStyle)
        org.kegbot.proto.Models.BeerStyleOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return org.kegbot.proto.Models.internal_static_BeerStyle_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return org.kegbot.proto.Models.internal_static_BeerStyle_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                org.kegbot.proto.Models.BeerStyle.class, org.kegbot.proto.Models.BeerStyle.Builder.class);
      }

      // Construct using org.kegbot.proto.Models.BeerStyle.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);
        name_ = "";
        bitField0_ = (bitField0_ & ~0x00000002);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return org.kegbot.proto.Models.internal_static_BeerStyle_descriptor;
      }

      @java.lang.Override
      public org.kegbot.proto.Models.BeerStyle getDefaultInstanceForType() {
        return org.kegbot.proto.Models.BeerStyle.getDefaultInstance();
      }

      @java.lang.Override
      public org.kegbot.proto.Models.BeerStyle build() {
        org.kegbot.proto.Models.BeerStyle result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public org.kegbot.proto.Models.BeerStyle buildPartial() {
        org.kegbot.proto.Models.BeerStyle result = new org.kegbot.proto.Models.BeerStyle(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)) {
          to_bitField0_ |= 0x00000002;
        }
        result.name_ = name_;
        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);
      }
      private int bitField0_;

      private int id_ ;
      /**
       * <pre>
       * The unique identifier for this beer style.
       * </pre>
       *
       * <code>required uint32 id = 1;</code>
       * @return Whether the id field is set.
       */
      @java.lang.Override
      public boolean hasId() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <pre>
       * The unique identifier for this beer style.
       * </pre>
       *
       * <code>required uint32 id = 1;</code>
       * @return The id.
       */
      @java.lang.Override
      public int getId() {
        return id_;
      }
      /**
       * <pre>
       * The unique identifier for this beer style.
       * </pre>
       *
       * <code>required uint32 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>
       * The unique identifier for this beer style.
       * </pre>
       *
       * <code>required uint32 id = 1;</code>
       * @return This builder for chaining.
       */
      public Builder clearId() {
        bitField0_ = (bitField0_ & ~0x00000001);
        id_ = 0;
        onChanged();
        return this;
      }

      private java.lang.Object name_ = "";
      /**
       * <pre>
       * The name of the beer style.
       * </pre>
       *
       * <code>required string name = 2;</code>
       * @return Whether the name field is set.
       */
      public boolean hasName() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <pre>
       * The name of the beer style.
       * </pre>
       *
       * <code>required 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>
       * The name of the beer style.
       * </pre>
       *
       * <code>required 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>
       * The name of the beer style.
       * </pre>
       *
       * <code>required 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>
       * The name of the beer style.
       * </pre>
       *
       * <code>required string name = 2;</code>
       * @return This builder for chaining.
       */
      public Builder clearName() {
        bitField0_ = (bitField0_ & ~0x00000002);
        name_ = getDefaultInstance().getName();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The name of the beer style.
       * </pre>
       *
       * <code>required 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;
      }
      @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:BeerStyle)
    }

    // @@protoc_insertion_point(class_scope:BeerStyle)
    private static final org.kegbot.proto.Models.BeerStyle DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new org.kegbot.proto.Models.BeerStyle();
    }

    public static org.kegbot.proto.Models.BeerStyle getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

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

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

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

    @java.lang.Override
    public org.kegbot.proto.Models.BeerStyle getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface BeerTypeOrBuilder extends
      // @@protoc_insertion_point(interface_extends:BeerType)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <pre>
     * The unique identifier for this beer type.
     * </pre>
     *
     * <code>required string id = 1;</code>
     * @return Whether the id field is set.
     */
    boolean hasId();
    /**
     * <pre>
     * The unique identifier for this beer type.
     * </pre>
     *
     * <code>required string id = 1;</code>
     * @return The id.
     */
    java.lang.String getId();
    /**
     * <pre>
     * The unique identifier for this beer type.
     * </pre>
     *
     * <code>required string id = 1;</code>
     * @return The bytes for id.
     */
    com.google.protobuf.ByteString
        getIdBytes();

    /**
     * <pre>
     * The brand name of the beer.
     * </pre>
     *
     * <code>required string name = 2;</code>
     * @return Whether the name field is set.
     */
    boolean hasName();
    /**
     * <pre>
     * The brand name of the beer.
     * </pre>
     *
     * <code>required string name = 2;</code>
     * @return The name.
     */
    java.lang.String getName();
    /**
     * <pre>
     * The brand name of the beer.
     * </pre>
     *
     * <code>required string name = 2;</code>
     * @return The bytes for name.
     */
    com.google.protobuf.ByteString
        getNameBytes();

    /**
     * <pre>
     * Brewer information for the beer.  May refer to an 'unknown' or generic
     * brewer record.
     * </pre>
     *
     * <code>required string brewer_id = 3;</code>
     * @return Whether the brewerId field is set.
     */
    boolean hasBrewerId();
    /**
     * <pre>
     * Brewer information for the beer.  May refer to an 'unknown' or generic
     * brewer record.
     * </pre>
     *
     * <code>required string brewer_id = 3;</code>
     * @return The brewerId.
     */
    java.lang.String getBrewerId();
    /**
     * <pre>
     * Brewer information for the beer.  May refer to an 'unknown' or generic
     * brewer record.
     * </pre>
     *
     * <code>required string brewer_id = 3;</code>
     * @return The bytes for brewerId.
     */
    com.google.protobuf.ByteString
        getBrewerIdBytes();

    /**
     * <pre>
     * Style information for the beer.  May refer to an 'unknown' or generic beer
     * style.
     * </pre>
     *
     * <code>required string style_id = 4;</code>
     * @return Whether the styleId field is set.
     */
    boolean hasStyleId();
    /**
     * <pre>
     * Style information for the beer.  May refer to an 'unknown' or generic beer
     * style.
     * </pre>
     *
     * <code>required string style_id = 4;</code>
     * @return The styleId.
     */
    java.lang.String getStyleId();
    /**
     * <pre>
     * Style information for the beer.  May refer to an 'unknown' or generic beer
     * style.
     * </pre>
     *
     * <code>required string style_id = 4;</code>
     * @return The bytes for styleId.
     */
    com.google.protobuf.ByteString
        getStyleIdBytes();

    /**
     * <pre>
     * For seasonal or special edition beers, the year or other edition name.
     * </pre>
     *
     * <code>optional string edition = 6;</code>
     * @return Whether the edition field is set.
     */
    boolean hasEdition();
    /**
     * <pre>
     * For seasonal or special edition beers, the year or other edition name.
     * </pre>
     *
     * <code>optional string edition = 6;</code>
     * @return The edition.
     */
    java.lang.String getEdition();
    /**
     * <pre>
     * For seasonal or special edition beers, the year or other edition name.
     * </pre>
     *
     * <code>optional string edition = 6;</code>
     * @return The bytes for edition.
     */
    com.google.protobuf.ByteString
        getEditionBytes();

    /**
     * <pre>
     * Alcohol by volume, as a percentage of the total volume.
     * </pre>
     *
     * <code>optional double abv = 7;</code>
     * @return Whether the abv field is set.
     */
    boolean hasAbv();
    /**
     * <pre>
     * Alcohol by volume, as a percentage of the total volume.
     * </pre>
     *
     * <code>optional double abv = 7;</code>
     * @return The abv.
     */
    double getAbv();

    /**
     * <pre>
     * Number of calories per ounce of beverage.
     * </pre>
     *
     * <code>optional double calories_oz = 8;</code>
     * @return Whether the caloriesOz field is set.
     */
    boolean hasCaloriesOz();
    /**
     * <pre>
     * Number of calories per ounce of beverage.
     * </pre>
     *
     * <code>optional double calories_oz = 8;</code>
     * @return The caloriesOz.
     */
    double getCaloriesOz();

    /**
     * <pre>
     * Number of carbohydrates per ounce of beverage.
     * </pre>
     *
     * <code>optional double carbs_oz = 9;</code>
     * @return Whether the carbsOz field is set.
     */
    boolean hasCarbsOz();
    /**
     * <pre>
     * Number of carbohydrates per ounce of beverage.
     * </pre>
     *
     * <code>optional double carbs_oz = 9;</code>
     * @return The carbsOz.
     */
    double getCarbsOz();

    /**
     * <pre>
     * Specific/final gravity of the beer, if known.
     * </pre>
     *
     * <code>optional double specific_gravity = 10;</code>
     * @return Whether the specificGravity field is set.
     */
    boolean hasSpecificGravity();
    /**
     * <pre>
     * Specific/final gravity of the beer, if known.
     * </pre>
     *
     * <code>optional double specific_gravity = 10;</code>
     * @return The specificGravity.
     */
    double getSpecificGravity();

    /**
     * <pre>
     * Original gravity of the beer, if known.
     * </pre>
     *
     * <code>optional double original_gravity = 11;</code>
     * @return Whether the originalGravity field is set.
     */
    boolean hasOriginalGravity();
    /**
     * <pre>
     * Original gravity of the beer, if known.
     * </pre>
     *
     * <code>optional double original_gravity = 11;</code>
     * @return The originalGravity.
     */
    double getOriginalGravity();

    /**
     * <pre>
     * Image for this beer.
     * </pre>
     *
     * <code>optional .Image image = 12;</code>
     * @return Whether the image field is set.
     */
    boolean hasImage();
    /**
     * <pre>
     * Image for this beer.
     * </pre>
     *
     * <code>optional .Image image = 12;</code>
     * @return The image.
     */
    org.kegbot.proto.Models.Image getImage();
    /**
     * <pre>
     * Image for this beer.
     * </pre>
     *
     * <code>optional .Image image = 12;</code>
     */
    org.kegbot.proto.Models.ImageOrBuilder getImageOrBuilder();
  }
  /**
   * <pre>
   * A specific kind of beer: describes the beer's name, style, and brewer.
   * </pre>
   *
   * Protobuf type {@code BeerType}
   */
  public static final class BeerType extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:BeerType)
      BeerTypeOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use BeerType.newBuilder() to construct.
    private BeerType(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private BeerType() {
      id_ = "";
      name_ = "";
      brewerId_ = "";
      styleId_ = "";
      edition_ = "";
    }

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

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return org.kegbot.proto.Models.internal_static_BeerType_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return org.kegbot.proto.Models.internal_static_BeerType_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              org.kegbot.proto.Models.BeerType.class, org.kegbot.proto.Models.BeerType.Builder.class);
    }

    private int bitField0_;
    public static final int ID_FIELD_NUMBER = 1;
    private volatile java.lang.Object id_;
    /**
     * <pre>
     * The unique identifier for this beer type.
     * </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>
     * The unique identifier for this beer type.
     * </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>
     * The unique identifier for this beer type.
     * </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 NAME_FIELD_NUMBER = 2;
    private volatile java.lang.Object name_;
    /**
     * <pre>
     * The brand name of the beer.
     * </pre>
     *
     * <code>required string name = 2;</code>
     * @return Whether the name field is set.
     */
    @java.lang.Override
    public boolean hasName() {
      return ((bitField0_ & 0x00000002) != 0);
    }
    /**
     * <pre>
     * The brand name of the beer.
     * </pre>
     *
     * <code>required 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>
     * The brand name of the beer.
     * </pre>
     *
     * <code>required 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 BREWER_ID_FIELD_NUMBER = 3;
    private volatile java.lang.Object brewerId_;
    /**
     * <pre>
     * Brewer information for the beer.  May refer to an 'unknown' or generic
     * brewer record.
     * </pre>
     *
     * <code>required string brewer_id = 3;</code>
     * @return Whether the brewerId field is set.
     */
    @java.lang.Override
    public boolean hasBrewerId() {
      return ((bitField0_ & 0x00000004) != 0);
    }
    /**
     * <pre>
     * Brewer information for the beer.  May refer to an 'unknown' or generic
     * brewer record.
     * </pre>
     *
     * <code>required string brewer_id = 3;</code>
     * @return The brewerId.
     */
    @java.lang.Override
    public java.lang.String getBrewerId() {
      java.lang.Object ref = brewerId_;
      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()) {
          brewerId_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * Brewer information for the beer.  May refer to an 'unknown' or generic
     * brewer record.
     * </pre>
     *
     * <code>required string brewer_id = 3;</code>
     * @return The bytes for brewerId.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getBrewerIdBytes() {
      java.lang.Object ref = brewerId_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        brewerId_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int STYLE_ID_FIELD_NUMBER = 4;
    private volatile java.lang.Object styleId_;
    /**
     * <pre>
     * Style information for the beer.  May refer to an 'unknown' or generic beer
     * style.
     * </pre>
     *
     * <code>required string style_id = 4;</code>
     * @return Whether the styleId field is set.
     */
    @java.lang.Override
    public boolean hasStyleId() {
      return ((bitField0_ & 0x00000008) != 0);
    }
    /**
     * <pre>
     * Style information for the beer.  May refer to an 'unknown' or generic beer
     * style.
     * </pre>
     *
     * <code>required string style_id = 4;</code>
     * @return The styleId.
     */
    @java.lang.Override
    public java.lang.String getStyleId() {
      java.lang.Object ref = styleId_;
      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()) {
          styleId_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * Style information for the beer.  May refer to an 'unknown' or generic beer
     * style.
     * </pre>
     *
     * <code>required string style_id = 4;</code>
     * @return The bytes for styleId.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getStyleIdBytes() {
      java.lang.Object ref = styleId_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        styleId_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int EDITION_FIELD_NUMBER = 6;
    private volatile java.lang.Object edition_;
    /**
     * <pre>
     * For seasonal or special edition beers, the year or other edition name.
     * </pre>
     *
     * <code>optional string edition = 6;</code>
     * @return Whether the edition field is set.
     */
    @java.lang.Override
    public boolean hasEdition() {
      return ((bitField0_ & 0x00000010) != 0);
    }
    /**
     * <pre>
     * For seasonal or special edition beers, the year or other edition name.
     * </pre>
     *
     * <code>optional string edition = 6;</code>
     * @return The edition.
     */
    @java.lang.Override
    public java.lang.String getEdition() {
      java.lang.Object ref = edition_;
      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()) {
          edition_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * For seasonal or special edition beers, the year or other edition name.
     * </pre>
     *
     * <code>optional string edition = 6;</code>
     * @return The bytes for edition.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getEditionBytes() {
      java.lang.Object ref = edition_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        edition_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int ABV_FIELD_NUMBER = 7;
    private double abv_;
    /**
     * <pre>
     * Alcohol by volume, as a percentage of the total volume.
     * </pre>
     *
     * <code>optional double abv = 7;</code>
     * @return Whether the abv field is set.
     */
    @java.lang.Override
    public boolean hasAbv() {
      return ((bitField0_ & 0x00000020) != 0);
    }
    /**
     * <pre>
     * Alcohol by volume, as a percentage of the total volume.
     * </pre>
     *
     * <code>optional double abv = 7;</code>
     * @return The abv.
     */
    @java.lang.Override
    public double getAbv() {
      return abv_;
    }

    public static final int CALORIES_OZ_FIELD_NUMBER = 8;
    private double caloriesOz_;
    /**
     * <pre>
     * Number of calories per ounce of beverage.
     * </pre>
     *
     * <code>optional double calories_oz = 8;</code>
     * @return Whether the caloriesOz field is set.
     */
    @java.lang.Override
    public boolean hasCaloriesOz() {
      return ((bitField0_ & 0x00000040) != 0);
    }
    /**
     * <pre>
     * Number of calories per ounce of beverage.
     * </pre>
     *
     * <code>optional double calories_oz = 8;</code>
     * @return The caloriesOz.
     */
    @java.lang.Override
    public double getCaloriesOz() {
      return caloriesOz_;
    }

    public static final int CARBS_OZ_FIELD_NUMBER = 9;
    private double carbsOz_;
    /**
     * <pre>
     * Number of carbohydrates per ounce of beverage.
     * </pre>
     *
     * <code>optional double carbs_oz = 9;</code>
     * @return Whether the carbsOz field is set.
     */
    @java.lang.Override
    public boolean hasCarbsOz() {
      return ((bitField0_ & 0x00000080) != 0);
    }
    /**
     * <pre>
     * Number of carbohydrates per ounce of beverage.
     * </pre>
     *
     * <code>optional double carbs_oz = 9;</code>
     * @return The carbsOz.
     */
    @java.lang.Override
    public double getCarbsOz() {
      return carbsOz_;
    }

    public static final int SPECIFIC_GRAVITY_FIELD_NUMBER = 10;
    private double specificGravity_;
    /**
     * <pre>
     * Specific/final gravity of the beer, if known.
     * </pre>
     *
     * <code>optional double specific_gravity = 10;</code>
     * @return Whether the specificGravity field is set.
     */
    @java.lang.Override
    public boolean hasSpecificGravity() {
      return ((bitField0_ & 0x00000100) != 0);
    }
    /**
     * <pre>
     * Specific/final gravity of the beer, if known.
     * </pre>
     *
     * <code>optional double specific_gravity = 10;</code>
     * @return The specificGravity.
     */
    @java.lang.Override
    public double getSpecificGravity() {
      return specificGravity_;
    }

    public static final int ORIGINAL_GRAVITY_FIELD_NUMBER = 11;
    private double originalGravity_;
    /**
     * <pre>
     * Original gravity of the beer, if known.
     * </pre>
     *
     * <code>optional double original_gravity = 11;</code>
     * @return Whether the originalGravity field is set.
     */
    @java.lang.Override
    public boolean hasOriginalGravity() {
      return ((bitField0_ & 0x00000200) != 0);
    }
    /**
     * <pre>
     * Original gravity of the beer, if known.
     * </pre>
     *
     * <code>optional double original_gravity = 11;</code>
     * @return The originalGravity.
     */
    @java.lang.Override
    public double getOriginalGravity() {
      return originalGravity_;
    }

    public static final int IMAGE_FIELD_NUMBER = 12;
    private org.kegbot.proto.Models.Image image_;
    /**
     * <pre>
     * Image for this beer.
     * </pre>
     *
     * <code>optional .Image image = 12;</code>
     * @return Whether the image field is set.
     */
    @java.lang.Override
    public boolean hasImage() {
      return ((bitField0_ & 0x00000400) != 0);
    }
    /**
     * <pre>
     * Image for this beer.
     * </pre>
     *
     * <code>optional .Image image = 12;</code>
     * @return The image.
     */
    @java.lang.Override
    public org.kegbot.proto.Models.Image getImage() {
      return image_ == null ? org.kegbot.proto.Models.Image.getDefaultInstance() : image_;
    }
    /**
     * <pre>
     * Image for this beer.
     * </pre>
     *
     * <code>optional .Image image = 12;</code>
     */
    @java.lang.Override
    public org.kegbot.proto.Models.ImageOrBuilder getImageOrBuilder() {
      return image_ == null ? org.kegbot.proto.Models.Image.getDefaultInstance() : image_;
    }

    public static org.kegbot.proto.Models.BeerType parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.BeerType parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.BeerType parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.BeerType parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.BeerType parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.BeerType parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.BeerType parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.BeerType 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 org.kegbot.proto.Models.BeerType parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.BeerType 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 org.kegbot.proto.Models.BeerType parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.BeerType 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(org.kegbot.proto.Models.BeerType 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 specific kind of beer: describes the beer's name, style, and brewer.
     * </pre>
     *
     * Protobuf type {@code BeerType}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:BeerType)
        org.kegbot.proto.Models.BeerTypeOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return org.kegbot.proto.Models.internal_static_BeerType_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return org.kegbot.proto.Models.internal_static_BeerType_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                org.kegbot.proto.Models.BeerType.class, org.kegbot.proto.Models.BeerType.Builder.class);
      }

      // Construct using org.kegbot.proto.Models.BeerType.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
          getImageFieldBuilder();
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        id_ = "";
        bitField0_ = (bitField0_ & ~0x00000001);
        name_ = "";
        bitField0_ = (bitField0_ & ~0x00000002);
        brewerId_ = "";
        bitField0_ = (bitField0_ & ~0x00000004);
        styleId_ = "";
        bitField0_ = (bitField0_ & ~0x00000008);
        edition_ = "";
        bitField0_ = (bitField0_ & ~0x00000010);
        abv_ = 0D;
        bitField0_ = (bitField0_ & ~0x00000020);
        caloriesOz_ = 0D;
        bitField0_ = (bitField0_ & ~0x00000040);
        carbsOz_ = 0D;
        bitField0_ = (bitField0_ & ~0x00000080);
        specificGravity_ = 0D;
        bitField0_ = (bitField0_ & ~0x00000100);
        originalGravity_ = 0D;
        bitField0_ = (bitField0_ & ~0x00000200);
        if (imageBuilder_ == null) {
          image_ = null;
        } else {
          imageBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000400);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return org.kegbot.proto.Models.internal_static_BeerType_descriptor;
      }

      @java.lang.Override
      public org.kegbot.proto.Models.BeerType getDefaultInstanceForType() {
        return org.kegbot.proto.Models.BeerType.getDefaultInstance();
      }

      @java.lang.Override
      public org.kegbot.proto.Models.BeerType build() {
        org.kegbot.proto.Models.BeerType result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public org.kegbot.proto.Models.BeerType buildPartial() {
        org.kegbot.proto.Models.BeerType result = new org.kegbot.proto.Models.BeerType(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.brewerId_ = brewerId_;
        if (((from_bitField0_ & 0x00000008) != 0)) {
          to_bitField0_ |= 0x00000008;
        }
        result.styleId_ = styleId_;
        if (((from_bitField0_ & 0x00000010) != 0)) {
          to_bitField0_ |= 0x00000010;
        }
        result.edition_ = edition_;
        if (((from_bitField0_ & 0x00000020) != 0)) {
          result.abv_ = abv_;
          to_bitField0_ |= 0x00000020;
        }
        if (((from_bitField0_ & 0x00000040) != 0)) {
          result.caloriesOz_ = caloriesOz_;
          to_bitField0_ |= 0x00000040;
        }
        if (((from_bitField0_ & 0x00000080) != 0)) {
          result.carbsOz_ = carbsOz_;
          to_bitField0_ |= 0x00000080;
        }
        if (((from_bitField0_ & 0x00000100) != 0)) {
          result.specificGravity_ = specificGravity_;
          to_bitField0_ |= 0x00000100;
        }
        if (((from_bitField0_ & 0x00000200) != 0)) {
          result.originalGravity_ = originalGravity_;
          to_bitField0_ |= 0x00000200;
        }
        if (((from_bitField0_ & 0x00000400) != 0)) {
          if (imageBuilder_ == null) {
            result.image_ = image_;
          } else {
            result.image_ = imageBuilder_.build();
          }
          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);
      }
      private int bitField0_;

      private java.lang.Object id_ = "";
      /**
       * <pre>
       * The unique identifier for this beer type.
       * </pre>
       *
       * <code>required string id = 1;</code>
       * @return Whether the id field is set.
       */
      public boolean hasId() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <pre>
       * The unique identifier for this beer type.
       * </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>
       * The unique identifier for this beer type.
       * </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>
       * The unique identifier for this beer type.
       * </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>
       * The unique identifier for this beer type.
       * </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>
       * The unique identifier for this beer type.
       * </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 name_ = "";
      /**
       * <pre>
       * The brand name of the beer.
       * </pre>
       *
       * <code>required string name = 2;</code>
       * @return Whether the name field is set.
       */
      public boolean hasName() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <pre>
       * The brand name of the beer.
       * </pre>
       *
       * <code>required 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>
       * The brand name of the beer.
       * </pre>
       *
       * <code>required 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>
       * The brand name of the beer.
       * </pre>
       *
       * <code>required 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>
       * The brand name of the beer.
       * </pre>
       *
       * <code>required string name = 2;</code>
       * @return This builder for chaining.
       */
      public Builder clearName() {
        bitField0_ = (bitField0_ & ~0x00000002);
        name_ = getDefaultInstance().getName();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The brand name of the beer.
       * </pre>
       *
       * <code>required 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 brewerId_ = "";
      /**
       * <pre>
       * Brewer information for the beer.  May refer to an 'unknown' or generic
       * brewer record.
       * </pre>
       *
       * <code>required string brewer_id = 3;</code>
       * @return Whether the brewerId field is set.
       */
      public boolean hasBrewerId() {
        return ((bitField0_ & 0x00000004) != 0);
      }
      /**
       * <pre>
       * Brewer information for the beer.  May refer to an 'unknown' or generic
       * brewer record.
       * </pre>
       *
       * <code>required string brewer_id = 3;</code>
       * @return The brewerId.
       */
      public java.lang.String getBrewerId() {
        java.lang.Object ref = brewerId_;
        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()) {
            brewerId_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * Brewer information for the beer.  May refer to an 'unknown' or generic
       * brewer record.
       * </pre>
       *
       * <code>required string brewer_id = 3;</code>
       * @return The bytes for brewerId.
       */
      public com.google.protobuf.ByteString
          getBrewerIdBytes() {
        java.lang.Object ref = brewerId_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          brewerId_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * Brewer information for the beer.  May refer to an 'unknown' or generic
       * brewer record.
       * </pre>
       *
       * <code>required string brewer_id = 3;</code>
       * @param value The brewerId to set.
       * @return This builder for chaining.
       */
      public Builder setBrewerId(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
        brewerId_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Brewer information for the beer.  May refer to an 'unknown' or generic
       * brewer record.
       * </pre>
       *
       * <code>required string brewer_id = 3;</code>
       * @return This builder for chaining.
       */
      public Builder clearBrewerId() {
        bitField0_ = (bitField0_ & ~0x00000004);
        brewerId_ = getDefaultInstance().getBrewerId();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Brewer information for the beer.  May refer to an 'unknown' or generic
       * brewer record.
       * </pre>
       *
       * <code>required string brewer_id = 3;</code>
       * @param value The bytes for brewerId to set.
       * @return This builder for chaining.
       */
      public Builder setBrewerIdBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
        brewerId_ = value;
        onChanged();
        return this;
      }

      private java.lang.Object styleId_ = "";
      /**
       * <pre>
       * Style information for the beer.  May refer to an 'unknown' or generic beer
       * style.
       * </pre>
       *
       * <code>required string style_id = 4;</code>
       * @return Whether the styleId field is set.
       */
      public boolean hasStyleId() {
        return ((bitField0_ & 0x00000008) != 0);
      }
      /**
       * <pre>
       * Style information for the beer.  May refer to an 'unknown' or generic beer
       * style.
       * </pre>
       *
       * <code>required string style_id = 4;</code>
       * @return The styleId.
       */
      public java.lang.String getStyleId() {
        java.lang.Object ref = styleId_;
        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()) {
            styleId_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * Style information for the beer.  May refer to an 'unknown' or generic beer
       * style.
       * </pre>
       *
       * <code>required string style_id = 4;</code>
       * @return The bytes for styleId.
       */
      public com.google.protobuf.ByteString
          getStyleIdBytes() {
        java.lang.Object ref = styleId_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          styleId_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * Style information for the beer.  May refer to an 'unknown' or generic beer
       * style.
       * </pre>
       *
       * <code>required string style_id = 4;</code>
       * @param value The styleId to set.
       * @return This builder for chaining.
       */
      public Builder setStyleId(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
        styleId_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Style information for the beer.  May refer to an 'unknown' or generic beer
       * style.
       * </pre>
       *
       * <code>required string style_id = 4;</code>
       * @return This builder for chaining.
       */
      public Builder clearStyleId() {
        bitField0_ = (bitField0_ & ~0x00000008);
        styleId_ = getDefaultInstance().getStyleId();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Style information for the beer.  May refer to an 'unknown' or generic beer
       * style.
       * </pre>
       *
       * <code>required string style_id = 4;</code>
       * @param value The bytes for styleId to set.
       * @return This builder for chaining.
       */
      public Builder setStyleIdBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
        styleId_ = value;
        onChanged();
        return this;
      }

      private java.lang.Object edition_ = "";
      /**
       * <pre>
       * For seasonal or special edition beers, the year or other edition name.
       * </pre>
       *
       * <code>optional string edition = 6;</code>
       * @return Whether the edition field is set.
       */
      public boolean hasEdition() {
        return ((bitField0_ & 0x00000010) != 0);
      }
      /**
       * <pre>
       * For seasonal or special edition beers, the year or other edition name.
       * </pre>
       *
       * <code>optional string edition = 6;</code>
       * @return The edition.
       */
      public java.lang.String getEdition() {
        java.lang.Object ref = edition_;
        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()) {
            edition_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * For seasonal or special edition beers, the year or other edition name.
       * </pre>
       *
       * <code>optional string edition = 6;</code>
       * @return The bytes for edition.
       */
      public com.google.protobuf.ByteString
          getEditionBytes() {
        java.lang.Object ref = edition_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          edition_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * For seasonal or special edition beers, the year or other edition name.
       * </pre>
       *
       * <code>optional string edition = 6;</code>
       * @param value The edition to set.
       * @return This builder for chaining.
       */
      public Builder setEdition(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
        edition_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * For seasonal or special edition beers, the year or other edition name.
       * </pre>
       *
       * <code>optional string edition = 6;</code>
       * @return This builder for chaining.
       */
      public Builder clearEdition() {
        bitField0_ = (bitField0_ & ~0x00000010);
        edition_ = getDefaultInstance().getEdition();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * For seasonal or special edition beers, the year or other edition name.
       * </pre>
       *
       * <code>optional string edition = 6;</code>
       * @param value The bytes for edition to set.
       * @return This builder for chaining.
       */
      public Builder setEditionBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
        edition_ = value;
        onChanged();
        return this;
      }

      private double abv_ ;
      /**
       * <pre>
       * Alcohol by volume, as a percentage of the total volume.
       * </pre>
       *
       * <code>optional double abv = 7;</code>
       * @return Whether the abv field is set.
       */
      @java.lang.Override
      public boolean hasAbv() {
        return ((bitField0_ & 0x00000020) != 0);
      }
      /**
       * <pre>
       * Alcohol by volume, as a percentage of the total volume.
       * </pre>
       *
       * <code>optional double abv = 7;</code>
       * @return The abv.
       */
      @java.lang.Override
      public double getAbv() {
        return abv_;
      }
      /**
       * <pre>
       * Alcohol by volume, as a percentage of the total volume.
       * </pre>
       *
       * <code>optional double abv = 7;</code>
       * @param value The abv to set.
       * @return This builder for chaining.
       */
      public Builder setAbv(double value) {
        bitField0_ |= 0x00000020;
        abv_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Alcohol by volume, as a percentage of the total volume.
       * </pre>
       *
       * <code>optional double abv = 7;</code>
       * @return This builder for chaining.
       */
      public Builder clearAbv() {
        bitField0_ = (bitField0_ & ~0x00000020);
        abv_ = 0D;
        onChanged();
        return this;
      }

      private double caloriesOz_ ;
      /**
       * <pre>
       * Number of calories per ounce of beverage.
       * </pre>
       *
       * <code>optional double calories_oz = 8;</code>
       * @return Whether the caloriesOz field is set.
       */
      @java.lang.Override
      public boolean hasCaloriesOz() {
        return ((bitField0_ & 0x00000040) != 0);
      }
      /**
       * <pre>
       * Number of calories per ounce of beverage.
       * </pre>
       *
       * <code>optional double calories_oz = 8;</code>
       * @return The caloriesOz.
       */
      @java.lang.Override
      public double getCaloriesOz() {
        return caloriesOz_;
      }
      /**
       * <pre>
       * Number of calories per ounce of beverage.
       * </pre>
       *
       * <code>optional double calories_oz = 8;</code>
       * @param value The caloriesOz to set.
       * @return This builder for chaining.
       */
      public Builder setCaloriesOz(double value) {
        bitField0_ |= 0x00000040;
        caloriesOz_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Number of calories per ounce of beverage.
       * </pre>
       *
       * <code>optional double calories_oz = 8;</code>
       * @return This builder for chaining.
       */
      public Builder clearCaloriesOz() {
        bitField0_ = (bitField0_ & ~0x00000040);
        caloriesOz_ = 0D;
        onChanged();
        return this;
      }

      private double carbsOz_ ;
      /**
       * <pre>
       * Number of carbohydrates per ounce of beverage.
       * </pre>
       *
       * <code>optional double carbs_oz = 9;</code>
       * @return Whether the carbsOz field is set.
       */
      @java.lang.Override
      public boolean hasCarbsOz() {
        return ((bitField0_ & 0x00000080) != 0);
      }
      /**
       * <pre>
       * Number of carbohydrates per ounce of beverage.
       * </pre>
       *
       * <code>optional double carbs_oz = 9;</code>
       * @return The carbsOz.
       */
      @java.lang.Override
      public double getCarbsOz() {
        return carbsOz_;
      }
      /**
       * <pre>
       * Number of carbohydrates per ounce of beverage.
       * </pre>
       *
       * <code>optional double carbs_oz = 9;</code>
       * @param value The carbsOz to set.
       * @return This builder for chaining.
       */
      public Builder setCarbsOz(double value) {
        bitField0_ |= 0x00000080;
        carbsOz_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Number of carbohydrates per ounce of beverage.
       * </pre>
       *
       * <code>optional double carbs_oz = 9;</code>
       * @return This builder for chaining.
       */
      public Builder clearCarbsOz() {
        bitField0_ = (bitField0_ & ~0x00000080);
        carbsOz_ = 0D;
        onChanged();
        return this;
      }

      private double specificGravity_ ;
      /**
       * <pre>
       * Specific/final gravity of the beer, if known.
       * </pre>
       *
       * <code>optional double specific_gravity = 10;</code>
       * @return Whether the specificGravity field is set.
       */
      @java.lang.Override
      public boolean hasSpecificGravity() {
        return ((bitField0_ & 0x00000100) != 0);
      }
      /**
       * <pre>
       * Specific/final gravity of the beer, if known.
       * </pre>
       *
       * <code>optional double specific_gravity = 10;</code>
       * @return The specificGravity.
       */
      @java.lang.Override
      public double getSpecificGravity() {
        return specificGravity_;
      }
      /**
       * <pre>
       * Specific/final gravity of the beer, if known.
       * </pre>
       *
       * <code>optional double specific_gravity = 10;</code>
       * @param value The specificGravity to set.
       * @return This builder for chaining.
       */
      public Builder setSpecificGravity(double value) {
        bitField0_ |= 0x00000100;
        specificGravity_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Specific/final gravity of the beer, if known.
       * </pre>
       *
       * <code>optional double specific_gravity = 10;</code>
       * @return This builder for chaining.
       */
      public Builder clearSpecificGravity() {
        bitField0_ = (bitField0_ & ~0x00000100);
        specificGravity_ = 0D;
        onChanged();
        return this;
      }

      private double originalGravity_ ;
      /**
       * <pre>
       * Original gravity of the beer, if known.
       * </pre>
       *
       * <code>optional double original_gravity = 11;</code>
       * @return Whether the originalGravity field is set.
       */
      @java.lang.Override
      public boolean hasOriginalGravity() {
        return ((bitField0_ & 0x00000200) != 0);
      }
      /**
       * <pre>
       * Original gravity of the beer, if known.
       * </pre>
       *
       * <code>optional double original_gravity = 11;</code>
       * @return The originalGravity.
       */
      @java.lang.Override
      public double getOriginalGravity() {
        return originalGravity_;
      }
      /**
       * <pre>
       * Original gravity of the beer, if known.
       * </pre>
       *
       * <code>optional double original_gravity = 11;</code>
       * @param value The originalGravity to set.
       * @return This builder for chaining.
       */
      public Builder setOriginalGravity(double value) {
        bitField0_ |= 0x00000200;
        originalGravity_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Original gravity of the beer, if known.
       * </pre>
       *
       * <code>optional double original_gravity = 11;</code>
       * @return This builder for chaining.
       */
      public Builder clearOriginalGravity() {
        bitField0_ = (bitField0_ & ~0x00000200);
        originalGravity_ = 0D;
        onChanged();
        return this;
      }

      private org.kegbot.proto.Models.Image image_;
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.Image, org.kegbot.proto.Models.Image.Builder, org.kegbot.proto.Models.ImageOrBuilder> imageBuilder_;
      /**
       * <pre>
       * Image for this beer.
       * </pre>
       *
       * <code>optional .Image image = 12;</code>
       * @return Whether the image field is set.
       */
      public boolean hasImage() {
        return ((bitField0_ & 0x00000400) != 0);
      }
      /**
       * <pre>
       * Image for this beer.
       * </pre>
       *
       * <code>optional .Image image = 12;</code>
       * @return The image.
       */
      public org.kegbot.proto.Models.Image getImage() {
        if (imageBuilder_ == null) {
          return image_ == null ? org.kegbot.proto.Models.Image.getDefaultInstance() : image_;
        } else {
          return imageBuilder_.getMessage();
        }
      }
      /**
       * <pre>
       * Image for this beer.
       * </pre>
       *
       * <code>optional .Image image = 12;</code>
       */
      public Builder setImage(org.kegbot.proto.Models.Image value) {
        if (imageBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          image_ = value;
          onChanged();
        } else {
          imageBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000400;
        return this;
      }
      /**
       * <pre>
       * Image for this beer.
       * </pre>
       *
       * <code>optional .Image image = 12;</code>
       */
      public Builder setImage(
          org.kegbot.proto.Models.Image.Builder builderForValue) {
        if (imageBuilder_ == null) {
          image_ = builderForValue.build();
          onChanged();
        } else {
          imageBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000400;
        return this;
      }
      /**
       * <pre>
       * Image for this beer.
       * </pre>
       *
       * <code>optional .Image image = 12;</code>
       */
      public Builder mergeImage(org.kegbot.proto.Models.Image value) {
        if (imageBuilder_ == null) {
          if (((bitField0_ & 0x00000400) != 0) &&
              image_ != null &&
              image_ != org.kegbot.proto.Models.Image.getDefaultInstance()) {
            image_ =
              org.kegbot.proto.Models.Image.newBuilder(image_).mergeFrom(value).buildPartial();
          } else {
            image_ = value;
          }
          onChanged();
        } else {
          imageBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000400;
        return this;
      }
      /**
       * <pre>
       * Image for this beer.
       * </pre>
       *
       * <code>optional .Image image = 12;</code>
       */
      public Builder clearImage() {
        if (imageBuilder_ == null) {
          image_ = null;
          onChanged();
        } else {
          imageBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000400);
        return this;
      }
      /**
       * <pre>
       * Image for this beer.
       * </pre>
       *
       * <code>optional .Image image = 12;</code>
       */
      public org.kegbot.proto.Models.Image.Builder getImageBuilder() {
        bitField0_ |= 0x00000400;
        onChanged();
        return getImageFieldBuilder().getBuilder();
      }
      /**
       * <pre>
       * Image for this beer.
       * </pre>
       *
       * <code>optional .Image image = 12;</code>
       */
      public org.kegbot.proto.Models.ImageOrBuilder getImageOrBuilder() {
        if (imageBuilder_ != null) {
          return imageBuilder_.getMessageOrBuilder();
        } else {
          return image_ == null ?
              org.kegbot.proto.Models.Image.getDefaultInstance() : image_;
        }
      }
      /**
       * <pre>
       * Image for this beer.
       * </pre>
       *
       * <code>optional .Image image = 12;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.Image, org.kegbot.proto.Models.Image.Builder, org.kegbot.proto.Models.ImageOrBuilder> 
          getImageFieldBuilder() {
        if (imageBuilder_ == null) {
          imageBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              org.kegbot.proto.Models.Image, org.kegbot.proto.Models.Image.Builder, org.kegbot.proto.Models.ImageOrBuilder>(
                  getImage(),
                  getParentForChildren(),
                  isClean());
          image_ = null;
        }
        return imageBuilder_;
      }
      @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:BeerType)
    }

    // @@protoc_insertion_point(class_scope:BeerType)
    private static final org.kegbot.proto.Models.BeerType DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new org.kegbot.proto.Models.BeerType();
    }

    public static org.kegbot.proto.Models.BeerType getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

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

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

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

    @java.lang.Override
    public org.kegbot.proto.Models.BeerType getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface BrewerOrBuilder extends
      // @@protoc_insertion_point(interface_extends:Brewer)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <pre>
     * The unique identifier for this beer type.
     * </pre>
     *
     * <code>required string id = 1;</code>
     * @return Whether the id field is set.
     */
    boolean hasId();
    /**
     * <pre>
     * The unique identifier for this beer type.
     * </pre>
     *
     * <code>required string id = 1;</code>
     * @return The id.
     */
    java.lang.String getId();
    /**
     * <pre>
     * The unique identifier for this beer type.
     * </pre>
     *
     * <code>required string id = 1;</code>
     * @return The bytes for id.
     */
    com.google.protobuf.ByteString
        getIdBytes();

    /**
     * <pre>
     * The name of the brewer.
     * </pre>
     *
     * <code>required string name = 2;</code>
     * @return Whether the name field is set.
     */
    boolean hasName();
    /**
     * <pre>
     * The name of the brewer.
     * </pre>
     *
     * <code>required string name = 2;</code>
     * @return The name.
     */
    java.lang.String getName();
    /**
     * <pre>
     * The name of the brewer.
     * </pre>
     *
     * <code>required string name = 2;</code>
     * @return The bytes for name.
     */
    com.google.protobuf.ByteString
        getNameBytes();

    /**
     * <pre>
     * The country of the brewer's headquarters.
     * </pre>
     *
     * <code>optional string country = 3 [default = ""];</code>
     * @return Whether the country field is set.
     */
    boolean hasCountry();
    /**
     * <pre>
     * The country of the brewer's headquarters.
     * </pre>
     *
     * <code>optional string country = 3 [default = ""];</code>
     * @return The country.
     */
    java.lang.String getCountry();
    /**
     * <pre>
     * The country of the brewer's headquarters.
     * </pre>
     *
     * <code>optional string country = 3 [default = ""];</code>
     * @return The bytes for country.
     */
    com.google.protobuf.ByteString
        getCountryBytes();

    /**
     * <pre>
     * The state of the brewer's headquarters.
     * </pre>
     *
     * <code>optional string origin_state = 4 [default = ""];</code>
     * @return Whether the originState field is set.
     */
    boolean hasOriginState();
    /**
     * <pre>
     * The state of the brewer's headquarters.
     * </pre>
     *
     * <code>optional string origin_state = 4 [default = ""];</code>
     * @return The originState.
     */
    java.lang.String getOriginState();
    /**
     * <pre>
     * The state of the brewer's headquarters.
     * </pre>
     *
     * <code>optional string origin_state = 4 [default = ""];</code>
     * @return The bytes for originState.
     */
    com.google.protobuf.ByteString
        getOriginStateBytes();

    /**
     * <pre>
     * The city of the brewer's headquarters.
     * </pre>
     *
     * <code>optional string origin_city = 5 [default = ""];</code>
     * @return Whether the originCity field is set.
     */
    boolean hasOriginCity();
    /**
     * <pre>
     * The city of the brewer's headquarters.
     * </pre>
     *
     * <code>optional string origin_city = 5 [default = ""];</code>
     * @return The originCity.
     */
    java.lang.String getOriginCity();
    /**
     * <pre>
     * The city of the brewer's headquarters.
     * </pre>
     *
     * <code>optional string origin_city = 5 [default = ""];</code>
     * @return The bytes for originCity.
     */
    com.google.protobuf.ByteString
        getOriginCityBytes();

    /**
     * <pre>
     * Type of production (usually either 'retail' or 'homebrew').
     * </pre>
     *
     * <code>optional string production = 6 [default = ""];</code>
     * @return Whether the production field is set.
     */
    boolean hasProduction();
    /**
     * <pre>
     * Type of production (usually either 'retail' or 'homebrew').
     * </pre>
     *
     * <code>optional string production = 6 [default = ""];</code>
     * @return The production.
     */
    java.lang.String getProduction();
    /**
     * <pre>
     * Type of production (usually either 'retail' or 'homebrew').
     * </pre>
     *
     * <code>optional string production = 6 [default = ""];</code>
     * @return The bytes for production.
     */
    com.google.protobuf.ByteString
        getProductionBytes();

    /**
     * <pre>
     * URL of brewer.
     * </pre>
     *
     * <code>optional string url = 7 [default = ""];</code>
     * @return Whether the url field is set.
     */
    boolean hasUrl();
    /**
     * <pre>
     * URL of brewer.
     * </pre>
     *
     * <code>optional string url = 7 [default = ""];</code>
     * @return The url.
     */
    java.lang.String getUrl();
    /**
     * <pre>
     * URL of brewer.
     * </pre>
     *
     * <code>optional string url = 7 [default = ""];</code>
     * @return The bytes for url.
     */
    com.google.protobuf.ByteString
        getUrlBytes();

    /**
     * <pre>
     * Free-form description.
     * </pre>
     *
     * <code>optional string description = 8 [default = ""];</code>
     * @return Whether the description field is set.
     */
    boolean hasDescription();
    /**
     * <pre>
     * Free-form description.
     * </pre>
     *
     * <code>optional string description = 8 [default = ""];</code>
     * @return The description.
     */
    java.lang.String getDescription();
    /**
     * <pre>
     * Free-form description.
     * </pre>
     *
     * <code>optional string description = 8 [default = ""];</code>
     * @return The bytes for description.
     */
    com.google.protobuf.ByteString
        getDescriptionBytes();

    /**
     * <pre>
     * Image or logo for this brewer.
     * </pre>
     *
     * <code>optional .Image image = 9;</code>
     * @return Whether the image field is set.
     */
    boolean hasImage();
    /**
     * <pre>
     * Image or logo for this brewer.
     * </pre>
     *
     * <code>optional .Image image = 9;</code>
     * @return The image.
     */
    org.kegbot.proto.Models.Image getImage();
    /**
     * <pre>
     * Image or logo for this brewer.
     * </pre>
     *
     * <code>optional .Image image = 9;</code>
     */
    org.kegbot.proto.Models.ImageOrBuilder getImageOrBuilder();
  }
  /**
   * <pre>
   * A specific producer of our favorite beverage.
   * </pre>
   *
   * Protobuf type {@code Brewer}
   */
  public static final class Brewer extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:Brewer)
      BrewerOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use Brewer.newBuilder() to construct.
    private Brewer(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private Brewer() {
      id_ = "";
      name_ = "";
      country_ = "";
      originState_ = "";
      originCity_ = "";
      production_ = "";
      url_ = "";
      description_ = "";
    }

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

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return org.kegbot.proto.Models.internal_static_Brewer_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return org.kegbot.proto.Models.internal_static_Brewer_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              org.kegbot.proto.Models.Brewer.class, org.kegbot.proto.Models.Brewer.Builder.class);
    }

    private int bitField0_;
    public static final int ID_FIELD_NUMBER = 1;
    private volatile java.lang.Object id_;
    /**
     * <pre>
     * The unique identifier for this beer type.
     * </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>
     * The unique identifier for this beer type.
     * </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>
     * The unique identifier for this beer type.
     * </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 NAME_FIELD_NUMBER = 2;
    private volatile java.lang.Object name_;
    /**
     * <pre>
     * The name of the brewer.
     * </pre>
     *
     * <code>required string name = 2;</code>
     * @return Whether the name field is set.
     */
    @java.lang.Override
    public boolean hasName() {
      return ((bitField0_ & 0x00000002) != 0);
    }
    /**
     * <pre>
     * The name of the brewer.
     * </pre>
     *
     * <code>required 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>
     * The name of the brewer.
     * </pre>
     *
     * <code>required 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 COUNTRY_FIELD_NUMBER = 3;
    private volatile java.lang.Object country_;
    /**
     * <pre>
     * The country of the brewer's headquarters.
     * </pre>
     *
     * <code>optional string country = 3 [default = ""];</code>
     * @return Whether the country field is set.
     */
    @java.lang.Override
    public boolean hasCountry() {
      return ((bitField0_ & 0x00000004) != 0);
    }
    /**
     * <pre>
     * The country of the brewer's headquarters.
     * </pre>
     *
     * <code>optional string country = 3 [default = ""];</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>
     * The country of the brewer's headquarters.
     * </pre>
     *
     * <code>optional string country = 3 [default = ""];</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 ORIGIN_STATE_FIELD_NUMBER = 4;
    private volatile java.lang.Object originState_;
    /**
     * <pre>
     * The state of the brewer's headquarters.
     * </pre>
     *
     * <code>optional string origin_state = 4 [default = ""];</code>
     * @return Whether the originState field is set.
     */
    @java.lang.Override
    public boolean hasOriginState() {
      return ((bitField0_ & 0x00000008) != 0);
    }
    /**
     * <pre>
     * The state of the brewer's headquarters.
     * </pre>
     *
     * <code>optional string origin_state = 4 [default = ""];</code>
     * @return The originState.
     */
    @java.lang.Override
    public java.lang.String getOriginState() {
      java.lang.Object ref = originState_;
      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()) {
          originState_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * The state of the brewer's headquarters.
     * </pre>
     *
     * <code>optional string origin_state = 4 [default = ""];</code>
     * @return The bytes for originState.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getOriginStateBytes() {
      java.lang.Object ref = originState_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        originState_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int ORIGIN_CITY_FIELD_NUMBER = 5;
    private volatile java.lang.Object originCity_;
    /**
     * <pre>
     * The city of the brewer's headquarters.
     * </pre>
     *
     * <code>optional string origin_city = 5 [default = ""];</code>
     * @return Whether the originCity field is set.
     */
    @java.lang.Override
    public boolean hasOriginCity() {
      return ((bitField0_ & 0x00000010) != 0);
    }
    /**
     * <pre>
     * The city of the brewer's headquarters.
     * </pre>
     *
     * <code>optional string origin_city = 5 [default = ""];</code>
     * @return The originCity.
     */
    @java.lang.Override
    public java.lang.String getOriginCity() {
      java.lang.Object ref = originCity_;
      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()) {
          originCity_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * The city of the brewer's headquarters.
     * </pre>
     *
     * <code>optional string origin_city = 5 [default = ""];</code>
     * @return The bytes for originCity.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getOriginCityBytes() {
      java.lang.Object ref = originCity_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        originCity_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int PRODUCTION_FIELD_NUMBER = 6;
    private volatile java.lang.Object production_;
    /**
     * <pre>
     * Type of production (usually either 'retail' or 'homebrew').
     * </pre>
     *
     * <code>optional string production = 6 [default = ""];</code>
     * @return Whether the production field is set.
     */
    @java.lang.Override
    public boolean hasProduction() {
      return ((bitField0_ & 0x00000020) != 0);
    }
    /**
     * <pre>
     * Type of production (usually either 'retail' or 'homebrew').
     * </pre>
     *
     * <code>optional string production = 6 [default = ""];</code>
     * @return The production.
     */
    @java.lang.Override
    public java.lang.String getProduction() {
      java.lang.Object ref = production_;
      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()) {
          production_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * Type of production (usually either 'retail' or 'homebrew').
     * </pre>
     *
     * <code>optional string production = 6 [default = ""];</code>
     * @return The bytes for production.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getProductionBytes() {
      java.lang.Object ref = production_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        production_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int URL_FIELD_NUMBER = 7;
    private volatile java.lang.Object url_;
    /**
     * <pre>
     * URL of brewer.
     * </pre>
     *
     * <code>optional string url = 7 [default = ""];</code>
     * @return Whether the url field is set.
     */
    @java.lang.Override
    public boolean hasUrl() {
      return ((bitField0_ & 0x00000040) != 0);
    }
    /**
     * <pre>
     * URL of brewer.
     * </pre>
     *
     * <code>optional string url = 7 [default = ""];</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 brewer.
     * </pre>
     *
     * <code>optional string url = 7 [default = ""];</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 DESCRIPTION_FIELD_NUMBER = 8;
    private volatile java.lang.Object description_;
    /**
     * <pre>
     * Free-form description.
     * </pre>
     *
     * <code>optional string description = 8 [default = ""];</code>
     * @return Whether the description field is set.
     */
    @java.lang.Override
    public boolean hasDescription() {
      return ((bitField0_ & 0x00000080) != 0);
    }
    /**
     * <pre>
     * Free-form description.
     * </pre>
     *
     * <code>optional string description = 8 [default = ""];</code>
     * @return The description.
     */
    @java.lang.Override
    public java.lang.String getDescription() {
      java.lang.Object ref = description_;
      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()) {
          description_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * Free-form description.
     * </pre>
     *
     * <code>optional string description = 8 [default = ""];</code>
     * @return The bytes for description.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getDescriptionBytes() {
      java.lang.Object ref = description_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        description_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int IMAGE_FIELD_NUMBER = 9;
    private org.kegbot.proto.Models.Image image_;
    /**
     * <pre>
     * Image or logo for this brewer.
     * </pre>
     *
     * <code>optional .Image image = 9;</code>
     * @return Whether the image field is set.
     */
    @java.lang.Override
    public boolean hasImage() {
      return ((bitField0_ & 0x00000100) != 0);
    }
    /**
     * <pre>
     * Image or logo for this brewer.
     * </pre>
     *
     * <code>optional .Image image = 9;</code>
     * @return The image.
     */
    @java.lang.Override
    public org.kegbot.proto.Models.Image getImage() {
      return image_ == null ? org.kegbot.proto.Models.Image.getDefaultInstance() : image_;
    }
    /**
     * <pre>
     * Image or logo for this brewer.
     * </pre>
     *
     * <code>optional .Image image = 9;</code>
     */
    @java.lang.Override
    public org.kegbot.proto.Models.ImageOrBuilder getImageOrBuilder() {
      return image_ == null ? org.kegbot.proto.Models.Image.getDefaultInstance() : image_;
    }

    public static org.kegbot.proto.Models.Brewer parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.Brewer parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.Brewer parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.Brewer parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.Brewer parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.Brewer parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.Brewer parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.Brewer 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 org.kegbot.proto.Models.Brewer parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.Brewer 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 org.kegbot.proto.Models.Brewer parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.Brewer 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(org.kegbot.proto.Models.Brewer 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 specific producer of our favorite beverage.
     * </pre>
     *
     * Protobuf type {@code Brewer}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:Brewer)
        org.kegbot.proto.Models.BrewerOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return org.kegbot.proto.Models.internal_static_Brewer_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return org.kegbot.proto.Models.internal_static_Brewer_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                org.kegbot.proto.Models.Brewer.class, org.kegbot.proto.Models.Brewer.Builder.class);
      }

      // Construct using org.kegbot.proto.Models.Brewer.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
          getImageFieldBuilder();
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        id_ = "";
        bitField0_ = (bitField0_ & ~0x00000001);
        name_ = "";
        bitField0_ = (bitField0_ & ~0x00000002);
        country_ = "";
        bitField0_ = (bitField0_ & ~0x00000004);
        originState_ = "";
        bitField0_ = (bitField0_ & ~0x00000008);
        originCity_ = "";
        bitField0_ = (bitField0_ & ~0x00000010);
        production_ = "";
        bitField0_ = (bitField0_ & ~0x00000020);
        url_ = "";
        bitField0_ = (bitField0_ & ~0x00000040);
        description_ = "";
        bitField0_ = (bitField0_ & ~0x00000080);
        if (imageBuilder_ == null) {
          image_ = null;
        } else {
          imageBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000100);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return org.kegbot.proto.Models.internal_static_Brewer_descriptor;
      }

      @java.lang.Override
      public org.kegbot.proto.Models.Brewer getDefaultInstanceForType() {
        return org.kegbot.proto.Models.Brewer.getDefaultInstance();
      }

      @java.lang.Override
      public org.kegbot.proto.Models.Brewer build() {
        org.kegbot.proto.Models.Brewer result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public org.kegbot.proto.Models.Brewer buildPartial() {
        org.kegbot.proto.Models.Brewer result = new org.kegbot.proto.Models.Brewer(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.country_ = country_;
        if (((from_bitField0_ & 0x00000008) != 0)) {
          to_bitField0_ |= 0x00000008;
        }
        result.originState_ = originState_;
        if (((from_bitField0_ & 0x00000010) != 0)) {
          to_bitField0_ |= 0x00000010;
        }
        result.originCity_ = originCity_;
        if (((from_bitField0_ & 0x00000020) != 0)) {
          to_bitField0_ |= 0x00000020;
        }
        result.production_ = production_;
        if (((from_bitField0_ & 0x00000040) != 0)) {
          to_bitField0_ |= 0x00000040;
        }
        result.url_ = url_;
        if (((from_bitField0_ & 0x00000080) != 0)) {
          to_bitField0_ |= 0x00000080;
        }
        result.description_ = description_;
        if (((from_bitField0_ & 0x00000100) != 0)) {
          if (imageBuilder_ == null) {
            result.image_ = image_;
          } else {
            result.image_ = imageBuilder_.build();
          }
          to_bitField0_ |= 0x00000100;
        }
        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);
      }
      private int bitField0_;

      private java.lang.Object id_ = "";
      /**
       * <pre>
       * The unique identifier for this beer type.
       * </pre>
       *
       * <code>required string id = 1;</code>
       * @return Whether the id field is set.
       */
      public boolean hasId() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <pre>
       * The unique identifier for this beer type.
       * </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>
       * The unique identifier for this beer type.
       * </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>
       * The unique identifier for this beer type.
       * </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>
       * The unique identifier for this beer type.
       * </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>
       * The unique identifier for this beer type.
       * </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 name_ = "";
      /**
       * <pre>
       * The name of the brewer.
       * </pre>
       *
       * <code>required string name = 2;</code>
       * @return Whether the name field is set.
       */
      public boolean hasName() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <pre>
       * The name of the brewer.
       * </pre>
       *
       * <code>required 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>
       * The name of the brewer.
       * </pre>
       *
       * <code>required 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>
       * The name of the brewer.
       * </pre>
       *
       * <code>required 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>
       * The name of the brewer.
       * </pre>
       *
       * <code>required string name = 2;</code>
       * @return This builder for chaining.
       */
      public Builder clearName() {
        bitField0_ = (bitField0_ & ~0x00000002);
        name_ = getDefaultInstance().getName();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The name of the brewer.
       * </pre>
       *
       * <code>required 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 country_ = "";
      /**
       * <pre>
       * The country of the brewer's headquarters.
       * </pre>
       *
       * <code>optional string country = 3 [default = ""];</code>
       * @return Whether the country field is set.
       */
      public boolean hasCountry() {
        return ((bitField0_ & 0x00000004) != 0);
      }
      /**
       * <pre>
       * The country of the brewer's headquarters.
       * </pre>
       *
       * <code>optional string country = 3 [default = ""];</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>
       * The country of the brewer's headquarters.
       * </pre>
       *
       * <code>optional string country = 3 [default = ""];</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>
       * The country of the brewer's headquarters.
       * </pre>
       *
       * <code>optional string country = 3 [default = ""];</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>
       * The country of the brewer's headquarters.
       * </pre>
       *
       * <code>optional string country = 3 [default = ""];</code>
       * @return This builder for chaining.
       */
      public Builder clearCountry() {
        bitField0_ = (bitField0_ & ~0x00000004);
        country_ = getDefaultInstance().getCountry();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The country of the brewer's headquarters.
       * </pre>
       *
       * <code>optional string country = 3 [default = ""];</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 originState_ = "";
      /**
       * <pre>
       * The state of the brewer's headquarters.
       * </pre>
       *
       * <code>optional string origin_state = 4 [default = ""];</code>
       * @return Whether the originState field is set.
       */
      public boolean hasOriginState() {
        return ((bitField0_ & 0x00000008) != 0);
      }
      /**
       * <pre>
       * The state of the brewer's headquarters.
       * </pre>
       *
       * <code>optional string origin_state = 4 [default = ""];</code>
       * @return The originState.
       */
      public java.lang.String getOriginState() {
        java.lang.Object ref = originState_;
        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()) {
            originState_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * The state of the brewer's headquarters.
       * </pre>
       *
       * <code>optional string origin_state = 4 [default = ""];</code>
       * @return The bytes for originState.
       */
      public com.google.protobuf.ByteString
          getOriginStateBytes() {
        java.lang.Object ref = originState_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          originState_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * The state of the brewer's headquarters.
       * </pre>
       *
       * <code>optional string origin_state = 4 [default = ""];</code>
       * @param value The originState to set.
       * @return This builder for chaining.
       */
      public Builder setOriginState(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
        originState_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The state of the brewer's headquarters.
       * </pre>
       *
       * <code>optional string origin_state = 4 [default = ""];</code>
       * @return This builder for chaining.
       */
      public Builder clearOriginState() {
        bitField0_ = (bitField0_ & ~0x00000008);
        originState_ = getDefaultInstance().getOriginState();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The state of the brewer's headquarters.
       * </pre>
       *
       * <code>optional string origin_state = 4 [default = ""];</code>
       * @param value The bytes for originState to set.
       * @return This builder for chaining.
       */
      public Builder setOriginStateBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
        originState_ = value;
        onChanged();
        return this;
      }

      private java.lang.Object originCity_ = "";
      /**
       * <pre>
       * The city of the brewer's headquarters.
       * </pre>
       *
       * <code>optional string origin_city = 5 [default = ""];</code>
       * @return Whether the originCity field is set.
       */
      public boolean hasOriginCity() {
        return ((bitField0_ & 0x00000010) != 0);
      }
      /**
       * <pre>
       * The city of the brewer's headquarters.
       * </pre>
       *
       * <code>optional string origin_city = 5 [default = ""];</code>
       * @return The originCity.
       */
      public java.lang.String getOriginCity() {
        java.lang.Object ref = originCity_;
        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()) {
            originCity_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * The city of the brewer's headquarters.
       * </pre>
       *
       * <code>optional string origin_city = 5 [default = ""];</code>
       * @return The bytes for originCity.
       */
      public com.google.protobuf.ByteString
          getOriginCityBytes() {
        java.lang.Object ref = originCity_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          originCity_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * The city of the brewer's headquarters.
       * </pre>
       *
       * <code>optional string origin_city = 5 [default = ""];</code>
       * @param value The originCity to set.
       * @return This builder for chaining.
       */
      public Builder setOriginCity(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
        originCity_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The city of the brewer's headquarters.
       * </pre>
       *
       * <code>optional string origin_city = 5 [default = ""];</code>
       * @return This builder for chaining.
       */
      public Builder clearOriginCity() {
        bitField0_ = (bitField0_ & ~0x00000010);
        originCity_ = getDefaultInstance().getOriginCity();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The city of the brewer's headquarters.
       * </pre>
       *
       * <code>optional string origin_city = 5 [default = ""];</code>
       * @param value The bytes for originCity to set.
       * @return This builder for chaining.
       */
      public Builder setOriginCityBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
        originCity_ = value;
        onChanged();
        return this;
      }

      private java.lang.Object production_ = "";
      /**
       * <pre>
       * Type of production (usually either 'retail' or 'homebrew').
       * </pre>
       *
       * <code>optional string production = 6 [default = ""];</code>
       * @return Whether the production field is set.
       */
      public boolean hasProduction() {
        return ((bitField0_ & 0x00000020) != 0);
      }
      /**
       * <pre>
       * Type of production (usually either 'retail' or 'homebrew').
       * </pre>
       *
       * <code>optional string production = 6 [default = ""];</code>
       * @return The production.
       */
      public java.lang.String getProduction() {
        java.lang.Object ref = production_;
        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()) {
            production_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * Type of production (usually either 'retail' or 'homebrew').
       * </pre>
       *
       * <code>optional string production = 6 [default = ""];</code>
       * @return The bytes for production.
       */
      public com.google.protobuf.ByteString
          getProductionBytes() {
        java.lang.Object ref = production_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          production_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * Type of production (usually either 'retail' or 'homebrew').
       * </pre>
       *
       * <code>optional string production = 6 [default = ""];</code>
       * @param value The production to set.
       * @return This builder for chaining.
       */
      public Builder setProduction(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000020;
        production_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Type of production (usually either 'retail' or 'homebrew').
       * </pre>
       *
       * <code>optional string production = 6 [default = ""];</code>
       * @return This builder for chaining.
       */
      public Builder clearProduction() {
        bitField0_ = (bitField0_ & ~0x00000020);
        production_ = getDefaultInstance().getProduction();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Type of production (usually either 'retail' or 'homebrew').
       * </pre>
       *
       * <code>optional string production = 6 [default = ""];</code>
       * @param value The bytes for production to set.
       * @return This builder for chaining.
       */
      public Builder setProductionBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000020;
        production_ = value;
        onChanged();
        return this;
      }

      private java.lang.Object url_ = "";
      /**
       * <pre>
       * URL of brewer.
       * </pre>
       *
       * <code>optional string url = 7 [default = ""];</code>
       * @return Whether the url field is set.
       */
      public boolean hasUrl() {
        return ((bitField0_ & 0x00000040) != 0);
      }
      /**
       * <pre>
       * URL of brewer.
       * </pre>
       *
       * <code>optional string url = 7 [default = ""];</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 brewer.
       * </pre>
       *
       * <code>optional string url = 7 [default = ""];</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 brewer.
       * </pre>
       *
       * <code>optional string url = 7 [default = ""];</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_ |= 0x00000040;
        url_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * URL of brewer.
       * </pre>
       *
       * <code>optional string url = 7 [default = ""];</code>
       * @return This builder for chaining.
       */
      public Builder clearUrl() {
        bitField0_ = (bitField0_ & ~0x00000040);
        url_ = getDefaultInstance().getUrl();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * URL of brewer.
       * </pre>
       *
       * <code>optional string url = 7 [default = ""];</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_ |= 0x00000040;
        url_ = value;
        onChanged();
        return this;
      }

      private java.lang.Object description_ = "";
      /**
       * <pre>
       * Free-form description.
       * </pre>
       *
       * <code>optional string description = 8 [default = ""];</code>
       * @return Whether the description field is set.
       */
      public boolean hasDescription() {
        return ((bitField0_ & 0x00000080) != 0);
      }
      /**
       * <pre>
       * Free-form description.
       * </pre>
       *
       * <code>optional string description = 8 [default = ""];</code>
       * @return The description.
       */
      public java.lang.String getDescription() {
        java.lang.Object ref = description_;
        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()) {
            description_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * Free-form description.
       * </pre>
       *
       * <code>optional string description = 8 [default = ""];</code>
       * @return The bytes for description.
       */
      public com.google.protobuf.ByteString
          getDescriptionBytes() {
        java.lang.Object ref = description_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          description_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * Free-form description.
       * </pre>
       *
       * <code>optional string description = 8 [default = ""];</code>
       * @param value The description to set.
       * @return This builder for chaining.
       */
      public Builder setDescription(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000080;
        description_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Free-form description.
       * </pre>
       *
       * <code>optional string description = 8 [default = ""];</code>
       * @return This builder for chaining.
       */
      public Builder clearDescription() {
        bitField0_ = (bitField0_ & ~0x00000080);
        description_ = getDefaultInstance().getDescription();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Free-form description.
       * </pre>
       *
       * <code>optional string description = 8 [default = ""];</code>
       * @param value The bytes for description to set.
       * @return This builder for chaining.
       */
      public Builder setDescriptionBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000080;
        description_ = value;
        onChanged();
        return this;
      }

      private org.kegbot.proto.Models.Image image_;
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.Image, org.kegbot.proto.Models.Image.Builder, org.kegbot.proto.Models.ImageOrBuilder> imageBuilder_;
      /**
       * <pre>
       * Image or logo for this brewer.
       * </pre>
       *
       * <code>optional .Image image = 9;</code>
       * @return Whether the image field is set.
       */
      public boolean hasImage() {
        return ((bitField0_ & 0x00000100) != 0);
      }
      /**
       * <pre>
       * Image or logo for this brewer.
       * </pre>
       *
       * <code>optional .Image image = 9;</code>
       * @return The image.
       */
      public org.kegbot.proto.Models.Image getImage() {
        if (imageBuilder_ == null) {
          return image_ == null ? org.kegbot.proto.Models.Image.getDefaultInstance() : image_;
        } else {
          return imageBuilder_.getMessage();
        }
      }
      /**
       * <pre>
       * Image or logo for this brewer.
       * </pre>
       *
       * <code>optional .Image image = 9;</code>
       */
      public Builder setImage(org.kegbot.proto.Models.Image value) {
        if (imageBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          image_ = value;
          onChanged();
        } else {
          imageBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000100;
        return this;
      }
      /**
       * <pre>
       * Image or logo for this brewer.
       * </pre>
       *
       * <code>optional .Image image = 9;</code>
       */
      public Builder setImage(
          org.kegbot.proto.Models.Image.Builder builderForValue) {
        if (imageBuilder_ == null) {
          image_ = builderForValue.build();
          onChanged();
        } else {
          imageBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000100;
        return this;
      }
      /**
       * <pre>
       * Image or logo for this brewer.
       * </pre>
       *
       * <code>optional .Image image = 9;</code>
       */
      public Builder mergeImage(org.kegbot.proto.Models.Image value) {
        if (imageBuilder_ == null) {
          if (((bitField0_ & 0x00000100) != 0) &&
              image_ != null &&
              image_ != org.kegbot.proto.Models.Image.getDefaultInstance()) {
            image_ =
              org.kegbot.proto.Models.Image.newBuilder(image_).mergeFrom(value).buildPartial();
          } else {
            image_ = value;
          }
          onChanged();
        } else {
          imageBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000100;
        return this;
      }
      /**
       * <pre>
       * Image or logo for this brewer.
       * </pre>
       *
       * <code>optional .Image image = 9;</code>
       */
      public Builder clearImage() {
        if (imageBuilder_ == null) {
          image_ = null;
          onChanged();
        } else {
          imageBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000100);
        return this;
      }
      /**
       * <pre>
       * Image or logo for this brewer.
       * </pre>
       *
       * <code>optional .Image image = 9;</code>
       */
      public org.kegbot.proto.Models.Image.Builder getImageBuilder() {
        bitField0_ |= 0x00000100;
        onChanged();
        return getImageFieldBuilder().getBuilder();
      }
      /**
       * <pre>
       * Image or logo for this brewer.
       * </pre>
       *
       * <code>optional .Image image = 9;</code>
       */
      public org.kegbot.proto.Models.ImageOrBuilder getImageOrBuilder() {
        if (imageBuilder_ != null) {
          return imageBuilder_.getMessageOrBuilder();
        } else {
          return image_ == null ?
              org.kegbot.proto.Models.Image.getDefaultInstance() : image_;
        }
      }
      /**
       * <pre>
       * Image or logo for this brewer.
       * </pre>
       *
       * <code>optional .Image image = 9;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.Image, org.kegbot.proto.Models.Image.Builder, org.kegbot.proto.Models.ImageOrBuilder> 
          getImageFieldBuilder() {
        if (imageBuilder_ == null) {
          imageBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              org.kegbot.proto.Models.Image, org.kegbot.proto.Models.Image.Builder, org.kegbot.proto.Models.ImageOrBuilder>(
                  getImage(),
                  getParentForChildren(),
                  isClean());
          image_ = null;
        }
        return imageBuilder_;
      }
      @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:Brewer)
    }

    // @@protoc_insertion_point(class_scope:Brewer)
    private static final org.kegbot.proto.Models.Brewer DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new org.kegbot.proto.Models.Brewer();
    }

    public static org.kegbot.proto.Models.Brewer getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

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

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

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

    @java.lang.Override
    public org.kegbot.proto.Models.Brewer getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface DrinkOrBuilder extends
      // @@protoc_insertion_point(interface_extends:Drink)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <pre>
     * The unique identifier for this drink.
     * </pre>
     *
     * <code>required uint32 id = 1;</code>
     * @return Whether the id field is set.
     */
    boolean hasId();
    /**
     * <pre>
     * The unique identifier for this drink.
     * </pre>
     *
     * <code>required uint32 id = 1;</code>
     * @return The id.
     */
    int getId();

    /**
     * <pre>
     * The number of meter ticks recorded for the drink.
     * </pre>
     *
     * <code>required uint32 ticks = 2;</code>
     * @return Whether the ticks field is set.
     */
    boolean hasTicks();
    /**
     * <pre>
     * The number of meter ticks recorded for the drink.
     * </pre>
     *
     * <code>required uint32 ticks = 2;</code>
     * @return The ticks.
     */
    int getTicks();

    /**
     * <pre>
     * The volume of the drink, in milliliters.
     * </pre>
     *
     * <code>required double volume_ml = 3;</code>
     * @return Whether the volumeMl field is set.
     */
    boolean hasVolumeMl();
    /**
     * <pre>
     * The volume of the drink, in milliliters.
     * </pre>
     *
     * <code>required double volume_ml = 3;</code>
     * @return The volumeMl.
     */
    double getVolumeMl();

    /**
     * <pre>
     * The session this drink belongs to.
     * </pre>
     *
     * <code>required uint32 session_id = 4;</code>
     * @return Whether the sessionId field is set.
     */
    boolean hasSessionId();
    /**
     * <pre>
     * The session this drink belongs to.
     * </pre>
     *
     * <code>required uint32 session_id = 4;</code>
     * @return The sessionId.
     */
    int getSessionId();

    /**
     * <pre>
     * UTC time when the drink was poured, as an ISO8061 UTC timestamp.
     * </pre>
     *
     * <code>required string time = 5;</code>
     * @return Whether the time field is set.
     */
    boolean hasTime();
    /**
     * <pre>
     * UTC time when the drink was poured, as an ISO8061 UTC timestamp.
     * </pre>
     *
     * <code>required string time = 5;</code>
     * @return The time.
     */
    java.lang.String getTime();
    /**
     * <pre>
     * UTC time when the drink was poured, as an ISO8061 UTC timestamp.
     * </pre>
     *
     * <code>required string time = 5;</code>
     * @return The bytes for time.
     */
    com.google.protobuf.ByteString
        getTimeBytes();

    /**
     * <pre>
     * Duration, in seconds, of the pour.
     * </pre>
     *
     * <code>optional uint32 duration = 6;</code>
     * @return Whether the duration field is set.
     */
    boolean hasDuration();
    /**
     * <pre>
     * Duration, in seconds, of the pour.
     * </pre>
     *
     * <code>optional uint32 duration = 6;</code>
     * @return The duration.
     */
    int getDuration();

    /**
     * <pre>
     * The Keg from which the drink was poured.  May be unset if the drink was
     * not associated with a keg.
     * </pre>
     *
     * <code>optional uint32 keg_id = 8;</code>
     * @return Whether the kegId field is set.
     */
    boolean hasKegId();
    /**
     * <pre>
     * The Keg from which the drink was poured.  May be unset if the drink was
     * not associated with a keg.
     * </pre>
     *
     * <code>optional uint32 keg_id = 8;</code>
     * @return The kegId.
     */
    int getKegId();

    /**
     * <pre>
     * The User that poured the drink.  Snset if the drinker was unknown
     * (anonymous pour).
     * </pre>
     *
     * <code>optional string user_id = 9;</code>
     * @return Whether the userId field is set.
     */
    boolean hasUserId();
    /**
     * <pre>
     * The User that poured the drink.  Snset if the drinker was unknown
     * (anonymous pour).
     * </pre>
     *
     * <code>optional string user_id = 9;</code>
     * @return The userId.
     */
    java.lang.String getUserId();
    /**
     * <pre>
     * The User that poured the drink.  Snset if the drinker was unknown
     * (anonymous pour).
     * </pre>
     *
     * <code>optional string user_id = 9;</code>
     * @return The bytes for userId.
     */
    com.google.protobuf.ByteString
        getUserIdBytes();

    /**
     * <pre>
     * Auth token value used to pour the drink, if known.
     * </pre>
     *
     * <code>optional uint32 auth_token_id = 10;</code>
     * @return Whether the authTokenId field is set.
     */
    boolean hasAuthTokenId();
    /**
     * <pre>
     * Auth token value used to pour the drink, if known.
     * </pre>
     *
     * <code>optional uint32 auth_token_id = 10;</code>
     * @return The authTokenId.
     */
    int getAuthTokenId();

    /**
     * <pre>
     * Canonical URL for this object.
     * </pre>
     *
     * <code>optional string url = 11;</code>
     * @return Whether the url field is set.
     */
    boolean hasUrl();
    /**
     * <pre>
     * Canonical URL for this object.
     * </pre>
     *
     * <code>optional string url = 11;</code>
     * @return The url.
     */
    java.lang.String getUrl();
    /**
     * <pre>
     * Canonical URL for this object.
     * </pre>
     *
     * <code>optional string url = 11;</code>
     * @return The bytes for url.
     */
    com.google.protobuf.ByteString
        getUrlBytes();

    /**
     * <pre>
     * Comment from the drinker at the time of the pour.
     * </pre>
     *
     * <code>optional string shout = 12;</code>
     * @return Whether the shout field is set.
     */
    boolean hasShout();
    /**
     * <pre>
     * Comment from the drinker at the time of the pour.
     * </pre>
     *
     * <code>optional string shout = 12;</code>
     * @return The shout.
     */
    java.lang.String getShout();
    /**
     * <pre>
     * Comment from the drinker at the time of the pour.
     * </pre>
     *
     * <code>optional string shout = 12;</code>
     * @return The bytes for shout.
     */
    com.google.protobuf.ByteString
        getShoutBytes();

    /**
     * <code>optional .User user = 13;</code>
     * @return Whether the user field is set.
     */
    boolean hasUser();
    /**
     * <code>optional .User user = 13;</code>
     * @return The user.
     */
    org.kegbot.proto.Models.User getUser();
    /**
     * <code>optional .User user = 13;</code>
     */
    org.kegbot.proto.Models.UserOrBuilder getUserOrBuilder();

    /**
     * <code>optional .Keg keg = 14;</code>
     * @return Whether the keg field is set.
     */
    boolean hasKeg();
    /**
     * <code>optional .Keg keg = 14;</code>
     * @return The keg.
     */
    org.kegbot.proto.Models.Keg getKeg();
    /**
     * <code>optional .Keg keg = 14;</code>
     */
    org.kegbot.proto.Models.KegOrBuilder getKegOrBuilder();

    /**
     * <code>optional .Session session = 15;</code>
     * @return Whether the session field is set.
     */
    boolean hasSession();
    /**
     * <code>optional .Session session = 15;</code>
     * @return The session.
     */
    org.kegbot.proto.Models.Session getSession();
    /**
     * <code>optional .Session session = 15;</code>
     */
    org.kegbot.proto.Models.SessionOrBuilder getSessionOrBuilder();

    /**
     * <code>repeated .Image images = 16;</code>
     */
    java.util.List<org.kegbot.proto.Models.Image> 
        getImagesList();
    /**
     * <code>repeated .Image images = 16;</code>
     */
    org.kegbot.proto.Models.Image getImages(int index);
    /**
     * <code>repeated .Image images = 16;</code>
     */
    int getImagesCount();
    /**
     * <code>repeated .Image images = 16;</code>
     */
    java.util.List<? extends org.kegbot.proto.Models.ImageOrBuilder> 
        getImagesOrBuilderList();
    /**
     * <code>repeated .Image images = 16;</code>
     */
    org.kegbot.proto.Models.ImageOrBuilder getImagesOrBuilder(
        int index);

    /**
     * <pre>
     * Vector of tick updates. Format is: "&lt;time&gt;:&lt;amount&gt; [&lt;time&gt;:&lt;amount&gt; ...]",
     * where "time" is the delta (in ms) from the previous reading, and "amount"
     * is the delta in ticks from the previous reading.
     * </pre>
     *
     * <code>optional string tick_time_series = 17;</code>
     * @return Whether the tickTimeSeries field is set.
     */
    boolean hasTickTimeSeries();
    /**
     * <pre>
     * Vector of tick updates. Format is: "&lt;time&gt;:&lt;amount&gt; [&lt;time&gt;:&lt;amount&gt; ...]",
     * where "time" is the delta (in ms) from the previous reading, and "amount"
     * is the delta in ticks from the previous reading.
     * </pre>
     *
     * <code>optional string tick_time_series = 17;</code>
     * @return The tickTimeSeries.
     */
    java.lang.String getTickTimeSeries();
    /**
     * <pre>
     * Vector of tick updates. Format is: "&lt;time&gt;:&lt;amount&gt; [&lt;time&gt;:&lt;amount&gt; ...]",
     * where "time" is the delta (in ms) from the previous reading, and "amount"
     * is the delta in ticks from the previous reading.
     * </pre>
     *
     * <code>optional string tick_time_series = 17;</code>
     * @return The bytes for tickTimeSeries.
     */
    com.google.protobuf.ByteString
        getTickTimeSeriesBytes();
  }
  /**
   * <pre>
   * Describes a single recorded pour from the Kegbot.
   * </pre>
   *
   * Protobuf type {@code Drink}
   */
  public static final class Drink extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:Drink)
      DrinkOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use Drink.newBuilder() to construct.
    private Drink(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private Drink() {
      time_ = "";
      userId_ = "";
      url_ = "";
      shout_ = "";
      images_ = java.util.Collections.emptyList();
      tickTimeSeries_ = "";
    }

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

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return org.kegbot.proto.Models.internal_static_Drink_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return org.kegbot.proto.Models.internal_static_Drink_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              org.kegbot.proto.Models.Drink.class, org.kegbot.proto.Models.Drink.Builder.class);
    }

    private int bitField0_;
    public static final int ID_FIELD_NUMBER = 1;
    private int id_;
    /**
     * <pre>
     * The unique identifier for this drink.
     * </pre>
     *
     * <code>required uint32 id = 1;</code>
     * @return Whether the id field is set.
     */
    @java.lang.Override
    public boolean hasId() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <pre>
     * The unique identifier for this drink.
     * </pre>
     *
     * <code>required uint32 id = 1;</code>
     * @return The id.
     */
    @java.lang.Override
    public int getId() {
      return id_;
    }

    public static final int TICKS_FIELD_NUMBER = 2;
    private int ticks_;
    /**
     * <pre>
     * The number of meter ticks recorded for the drink.
     * </pre>
     *
     * <code>required uint32 ticks = 2;</code>
     * @return Whether the ticks field is set.
     */
    @java.lang.Override
    public boolean hasTicks() {
      return ((bitField0_ & 0x00000002) != 0);
    }
    /**
     * <pre>
     * The number of meter ticks recorded for the drink.
     * </pre>
     *
     * <code>required uint32 ticks = 2;</code>
     * @return The ticks.
     */
    @java.lang.Override
    public int getTicks() {
      return ticks_;
    }

    public static final int VOLUME_ML_FIELD_NUMBER = 3;
    private double volumeMl_;
    /**
     * <pre>
     * The volume of the drink, in milliliters.
     * </pre>
     *
     * <code>required double volume_ml = 3;</code>
     * @return Whether the volumeMl field is set.
     */
    @java.lang.Override
    public boolean hasVolumeMl() {
      return ((bitField0_ & 0x00000004) != 0);
    }
    /**
     * <pre>
     * The volume of the drink, in milliliters.
     * </pre>
     *
     * <code>required double volume_ml = 3;</code>
     * @return The volumeMl.
     */
    @java.lang.Override
    public double getVolumeMl() {
      return volumeMl_;
    }

    public static final int SESSION_ID_FIELD_NUMBER = 4;
    private int sessionId_;
    /**
     * <pre>
     * The session this drink belongs to.
     * </pre>
     *
     * <code>required uint32 session_id = 4;</code>
     * @return Whether the sessionId field is set.
     */
    @java.lang.Override
    public boolean hasSessionId() {
      return ((bitField0_ & 0x00000008) != 0);
    }
    /**
     * <pre>
     * The session this drink belongs to.
     * </pre>
     *
     * <code>required uint32 session_id = 4;</code>
     * @return The sessionId.
     */
    @java.lang.Override
    public int getSessionId() {
      return sessionId_;
    }

    public static final int TIME_FIELD_NUMBER = 5;
    private volatile java.lang.Object time_;
    /**
     * <pre>
     * UTC time when the drink was poured, as an ISO8061 UTC timestamp.
     * </pre>
     *
     * <code>required string time = 5;</code>
     * @return Whether the time field is set.
     */
    @java.lang.Override
    public boolean hasTime() {
      return ((bitField0_ & 0x00000010) != 0);
    }
    /**
     * <pre>
     * UTC time when the drink was poured, as an ISO8061 UTC timestamp.
     * </pre>
     *
     * <code>required string time = 5;</code>
     * @return The time.
     */
    @java.lang.Override
    public java.lang.String getTime() {
      java.lang.Object ref = time_;
      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()) {
          time_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * UTC time when the drink was poured, as an ISO8061 UTC timestamp.
     * </pre>
     *
     * <code>required string time = 5;</code>
     * @return The bytes for time.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getTimeBytes() {
      java.lang.Object ref = time_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        time_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int DURATION_FIELD_NUMBER = 6;
    private int duration_;
    /**
     * <pre>
     * Duration, in seconds, of the pour.
     * </pre>
     *
     * <code>optional uint32 duration = 6;</code>
     * @return Whether the duration field is set.
     */
    @java.lang.Override
    public boolean hasDuration() {
      return ((bitField0_ & 0x00000020) != 0);
    }
    /**
     * <pre>
     * Duration, in seconds, of the pour.
     * </pre>
     *
     * <code>optional uint32 duration = 6;</code>
     * @return The duration.
     */
    @java.lang.Override
    public int getDuration() {
      return duration_;
    }

    public static final int KEG_ID_FIELD_NUMBER = 8;
    private int kegId_;
    /**
     * <pre>
     * The Keg from which the drink was poured.  May be unset if the drink was
     * not associated with a keg.
     * </pre>
     *
     * <code>optional uint32 keg_id = 8;</code>
     * @return Whether the kegId field is set.
     */
    @java.lang.Override
    public boolean hasKegId() {
      return ((bitField0_ & 0x00000040) != 0);
    }
    /**
     * <pre>
     * The Keg from which the drink was poured.  May be unset if the drink was
     * not associated with a keg.
     * </pre>
     *
     * <code>optional uint32 keg_id = 8;</code>
     * @return The kegId.
     */
    @java.lang.Override
    public int getKegId() {
      return kegId_;
    }

    public static final int USER_ID_FIELD_NUMBER = 9;
    private volatile java.lang.Object userId_;
    /**
     * <pre>
     * The User that poured the drink.  Snset if the drinker was unknown
     * (anonymous pour).
     * </pre>
     *
     * <code>optional string user_id = 9;</code>
     * @return Whether the userId field is set.
     */
    @java.lang.Override
    public boolean hasUserId() {
      return ((bitField0_ & 0x00000080) != 0);
    }
    /**
     * <pre>
     * The User that poured the drink.  Snset if the drinker was unknown
     * (anonymous pour).
     * </pre>
     *
     * <code>optional string user_id = 9;</code>
     * @return The userId.
     */
    @java.lang.Override
    public java.lang.String getUserId() {
      java.lang.Object ref = userId_;
      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()) {
          userId_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * The User that poured the drink.  Snset if the drinker was unknown
     * (anonymous pour).
     * </pre>
     *
     * <code>optional string user_id = 9;</code>
     * @return The bytes for userId.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getUserIdBytes() {
      java.lang.Object ref = userId_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        userId_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int AUTH_TOKEN_ID_FIELD_NUMBER = 10;
    private int authTokenId_;
    /**
     * <pre>
     * Auth token value used to pour the drink, if known.
     * </pre>
     *
     * <code>optional uint32 auth_token_id = 10;</code>
     * @return Whether the authTokenId field is set.
     */
    @java.lang.Override
    public boolean hasAuthTokenId() {
      return ((bitField0_ & 0x00000100) != 0);
    }
    /**
     * <pre>
     * Auth token value used to pour the drink, if known.
     * </pre>
     *
     * <code>optional uint32 auth_token_id = 10;</code>
     * @return The authTokenId.
     */
    @java.lang.Override
    public int getAuthTokenId() {
      return authTokenId_;
    }

    public static final int URL_FIELD_NUMBER = 11;
    private volatile java.lang.Object url_;
    /**
     * <pre>
     * Canonical URL for this object.
     * </pre>
     *
     * <code>optional string url = 11;</code>
     * @return Whether the url field is set.
     */
    @java.lang.Override
    public boolean hasUrl() {
      return ((bitField0_ & 0x00000200) != 0);
    }
    /**
     * <pre>
     * Canonical URL for this object.
     * </pre>
     *
     * <code>optional string url = 11;</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>
     * Canonical URL for this object.
     * </pre>
     *
     * <code>optional string url = 11;</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 SHOUT_FIELD_NUMBER = 12;
    private volatile java.lang.Object shout_;
    /**
     * <pre>
     * Comment from the drinker at the time of the pour.
     * </pre>
     *
     * <code>optional string shout = 12;</code>
     * @return Whether the shout field is set.
     */
    @java.lang.Override
    public boolean hasShout() {
      return ((bitField0_ & 0x00000400) != 0);
    }
    /**
     * <pre>
     * Comment from the drinker at the time of the pour.
     * </pre>
     *
     * <code>optional string shout = 12;</code>
     * @return The shout.
     */
    @java.lang.Override
    public java.lang.String getShout() {
      java.lang.Object ref = shout_;
      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()) {
          shout_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * Comment from the drinker at the time of the pour.
     * </pre>
     *
     * <code>optional string shout = 12;</code>
     * @return The bytes for shout.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getShoutBytes() {
      java.lang.Object ref = shout_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        shout_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int USER_FIELD_NUMBER = 13;
    private org.kegbot.proto.Models.User user_;
    /**
     * <code>optional .User user = 13;</code>
     * @return Whether the user field is set.
     */
    @java.lang.Override
    public boolean hasUser() {
      return ((bitField0_ & 0x00000800) != 0);
    }
    /**
     * <code>optional .User user = 13;</code>
     * @return The user.
     */
    @java.lang.Override
    public org.kegbot.proto.Models.User getUser() {
      return user_ == null ? org.kegbot.proto.Models.User.getDefaultInstance() : user_;
    }
    /**
     * <code>optional .User user = 13;</code>
     */
    @java.lang.Override
    public org.kegbot.proto.Models.UserOrBuilder getUserOrBuilder() {
      return user_ == null ? org.kegbot.proto.Models.User.getDefaultInstance() : user_;
    }

    public static final int KEG_FIELD_NUMBER = 14;
    private org.kegbot.proto.Models.Keg keg_;
    /**
     * <code>optional .Keg keg = 14;</code>
     * @return Whether the keg field is set.
     */
    @java.lang.Override
    public boolean hasKeg() {
      return ((bitField0_ & 0x00001000) != 0);
    }
    /**
     * <code>optional .Keg keg = 14;</code>
     * @return The keg.
     */
    @java.lang.Override
    public org.kegbot.proto.Models.Keg getKeg() {
      return keg_ == null ? org.kegbot.proto.Models.Keg.getDefaultInstance() : keg_;
    }
    /**
     * <code>optional .Keg keg = 14;</code>
     */
    @java.lang.Override
    public org.kegbot.proto.Models.KegOrBuilder getKegOrBuilder() {
      return keg_ == null ? org.kegbot.proto.Models.Keg.getDefaultInstance() : keg_;
    }

    public static final int SESSION_FIELD_NUMBER = 15;
    private org.kegbot.proto.Models.Session session_;
    /**
     * <code>optional .Session session = 15;</code>
     * @return Whether the session field is set.
     */
    @java.lang.Override
    public boolean hasSession() {
      return ((bitField0_ & 0x00002000) != 0);
    }
    /**
     * <code>optional .Session session = 15;</code>
     * @return The session.
     */
    @java.lang.Override
    public org.kegbot.proto.Models.Session getSession() {
      return session_ == null ? org.kegbot.proto.Models.Session.getDefaultInstance() : session_;
    }
    /**
     * <code>optional .Session session = 15;</code>
     */
    @java.lang.Override
    public org.kegbot.proto.Models.SessionOrBuilder getSessionOrBuilder() {
      return session_ == null ? org.kegbot.proto.Models.Session.getDefaultInstance() : session_;
    }

    public static final int IMAGES_FIELD_NUMBER = 16;
    private java.util.List<org.kegbot.proto.Models.Image> images_;
    /**
     * <code>repeated .Image images = 16;</code>
     */
    @java.lang.Override
    public java.util.List<org.kegbot.proto.Models.Image> getImagesList() {
      return images_;
    }
    /**
     * <code>repeated .Image images = 16;</code>
     */
    @java.lang.Override
    public java.util.List<? extends org.kegbot.proto.Models.ImageOrBuilder> 
        getImagesOrBuilderList() {
      return images_;
    }
    /**
     * <code>repeated .Image images = 16;</code>
     */
    @java.lang.Override
    public int getImagesCount() {
      return images_.size();
    }
    /**
     * <code>repeated .Image images = 16;</code>
     */
    @java.lang.Override
    public org.kegbot.proto.Models.Image getImages(int index) {
      return images_.get(index);
    }
    /**
     * <code>repeated .Image images = 16;</code>
     */
    @java.lang.Override
    public org.kegbot.proto.Models.ImageOrBuilder getImagesOrBuilder(
        int index) {
      return images_.get(index);
    }

    public static final int TICK_TIME_SERIES_FIELD_NUMBER = 17;
    private volatile java.lang.Object tickTimeSeries_;
    /**
     * <pre>
     * Vector of tick updates. Format is: "&lt;time&gt;:&lt;amount&gt; [&lt;time&gt;:&lt;amount&gt; ...]",
     * where "time" is the delta (in ms) from the previous reading, and "amount"
     * is the delta in ticks from the previous reading.
     * </pre>
     *
     * <code>optional string tick_time_series = 17;</code>
     * @return Whether the tickTimeSeries field is set.
     */
    @java.lang.Override
    public boolean hasTickTimeSeries() {
      return ((bitField0_ & 0x00004000) != 0);
    }
    /**
     * <pre>
     * Vector of tick updates. Format is: "&lt;time&gt;:&lt;amount&gt; [&lt;time&gt;:&lt;amount&gt; ...]",
     * where "time" is the delta (in ms) from the previous reading, and "amount"
     * is the delta in ticks from the previous reading.
     * </pre>
     *
     * <code>optional string tick_time_series = 17;</code>
     * @return The tickTimeSeries.
     */
    @java.lang.Override
    public java.lang.String getTickTimeSeries() {
      java.lang.Object ref = tickTimeSeries_;
      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()) {
          tickTimeSeries_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * Vector of tick updates. Format is: "&lt;time&gt;:&lt;amount&gt; [&lt;time&gt;:&lt;amount&gt; ...]",
     * where "time" is the delta (in ms) from the previous reading, and "amount"
     * is the delta in ticks from the previous reading.
     * </pre>
     *
     * <code>optional string tick_time_series = 17;</code>
     * @return The bytes for tickTimeSeries.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getTickTimeSeriesBytes() {
      java.lang.Object ref = tickTimeSeries_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        tickTimeSeries_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static org.kegbot.proto.Models.Drink parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.Drink parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.Drink parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.Drink parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.Drink parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.Drink parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.Drink parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.Drink 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 org.kegbot.proto.Models.Drink parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.Drink 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 org.kegbot.proto.Models.Drink parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.Drink 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(org.kegbot.proto.Models.Drink 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>
     * Describes a single recorded pour from the Kegbot.
     * </pre>
     *
     * Protobuf type {@code Drink}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:Drink)
        org.kegbot.proto.Models.DrinkOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return org.kegbot.proto.Models.internal_static_Drink_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return org.kegbot.proto.Models.internal_static_Drink_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                org.kegbot.proto.Models.Drink.class, org.kegbot.proto.Models.Drink.Builder.class);
      }

      // Construct using org.kegbot.proto.Models.Drink.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
          getUserFieldBuilder();
          getKegFieldBuilder();
          getSessionFieldBuilder();
          getImagesFieldBuilder();
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        id_ = 0;
        bitField0_ = (bitField0_ & ~0x00000001);
        ticks_ = 0;
        bitField0_ = (bitField0_ & ~0x00000002);
        volumeMl_ = 0D;
        bitField0_ = (bitField0_ & ~0x00000004);
        sessionId_ = 0;
        bitField0_ = (bitField0_ & ~0x00000008);
        time_ = "";
        bitField0_ = (bitField0_ & ~0x00000010);
        duration_ = 0;
        bitField0_ = (bitField0_ & ~0x00000020);
        kegId_ = 0;
        bitField0_ = (bitField0_ & ~0x00000040);
        userId_ = "";
        bitField0_ = (bitField0_ & ~0x00000080);
        authTokenId_ = 0;
        bitField0_ = (bitField0_ & ~0x00000100);
        url_ = "";
        bitField0_ = (bitField0_ & ~0x00000200);
        shout_ = "";
        bitField0_ = (bitField0_ & ~0x00000400);
        if (userBuilder_ == null) {
          user_ = null;
        } else {
          userBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000800);
        if (kegBuilder_ == null) {
          keg_ = null;
        } else {
          kegBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00001000);
        if (sessionBuilder_ == null) {
          session_ = null;
        } else {
          sessionBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00002000);
        if (imagesBuilder_ == null) {
          images_ = java.util.Collections.emptyList();
          bitField0_ = (bitField0_ & ~0x00004000);
        } else {
          imagesBuilder_.clear();
        }
        tickTimeSeries_ = "";
        bitField0_ = (bitField0_ & ~0x00008000);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return org.kegbot.proto.Models.internal_static_Drink_descriptor;
      }

      @java.lang.Override
      public org.kegbot.proto.Models.Drink getDefaultInstanceForType() {
        return org.kegbot.proto.Models.Drink.getDefaultInstance();
      }

      @java.lang.Override
      public org.kegbot.proto.Models.Drink build() {
        org.kegbot.proto.Models.Drink result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public org.kegbot.proto.Models.Drink buildPartial() {
        org.kegbot.proto.Models.Drink result = new org.kegbot.proto.Models.Drink(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.ticks_ = ticks_;
          to_bitField0_ |= 0x00000002;
        }
        if (((from_bitField0_ & 0x00000004) != 0)) {
          result.volumeMl_ = volumeMl_;
          to_bitField0_ |= 0x00000004;
        }
        if (((from_bitField0_ & 0x00000008) != 0)) {
          result.sessionId_ = sessionId_;
          to_bitField0_ |= 0x00000008;
        }
        if (((from_bitField0_ & 0x00000010) != 0)) {
          to_bitField0_ |= 0x00000010;
        }
        result.time_ = time_;
        if (((from_bitField0_ & 0x00000020) != 0)) {
          result.duration_ = duration_;
          to_bitField0_ |= 0x00000020;
        }
        if (((from_bitField0_ & 0x00000040) != 0)) {
          result.kegId_ = kegId_;
          to_bitField0_ |= 0x00000040;
        }
        if (((from_bitField0_ & 0x00000080) != 0)) {
          to_bitField0_ |= 0x00000080;
        }
        result.userId_ = userId_;
        if (((from_bitField0_ & 0x00000100) != 0)) {
          result.authTokenId_ = authTokenId_;
          to_bitField0_ |= 0x00000100;
        }
        if (((from_bitField0_ & 0x00000200) != 0)) {
          to_bitField0_ |= 0x00000200;
        }
        result.url_ = url_;
        if (((from_bitField0_ & 0x00000400) != 0)) {
          to_bitField0_ |= 0x00000400;
        }
        result.shout_ = shout_;
        if (((from_bitField0_ & 0x00000800) != 0)) {
          if (userBuilder_ == null) {
            result.user_ = user_;
          } else {
            result.user_ = userBuilder_.build();
          }
          to_bitField0_ |= 0x00000800;
        }
        if (((from_bitField0_ & 0x00001000) != 0)) {
          if (kegBuilder_ == null) {
            result.keg_ = keg_;
          } else {
            result.keg_ = kegBuilder_.build();
          }
          to_bitField0_ |= 0x00001000;
        }
        if (((from_bitField0_ & 0x00002000) != 0)) {
          if (sessionBuilder_ == null) {
            result.session_ = session_;
          } else {
            result.session_ = sessionBuilder_.build();
          }
          to_bitField0_ |= 0x00002000;
        }
        if (imagesBuilder_ == null) {
          if (((bitField0_ & 0x00004000) != 0)) {
            images_ = java.util.Collections.unmodifiableList(images_);
            bitField0_ = (bitField0_ & ~0x00004000);
          }
          result.images_ = images_;
        } else {
          result.images_ = imagesBuilder_.build();
        }
        if (((from_bitField0_ & 0x00008000) != 0)) {
          to_bitField0_ |= 0x00004000;
        }
        result.tickTimeSeries_ = tickTimeSeries_;
        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);
      }
      private int bitField0_;

      private int id_ ;
      /**
       * <pre>
       * The unique identifier for this drink.
       * </pre>
       *
       * <code>required uint32 id = 1;</code>
       * @return Whether the id field is set.
       */
      @java.lang.Override
      public boolean hasId() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <pre>
       * The unique identifier for this drink.
       * </pre>
       *
       * <code>required uint32 id = 1;</code>
       * @return The id.
       */
      @java.lang.Override
      public int getId() {
        return id_;
      }
      /**
       * <pre>
       * The unique identifier for this drink.
       * </pre>
       *
       * <code>required uint32 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>
       * The unique identifier for this drink.
       * </pre>
       *
       * <code>required uint32 id = 1;</code>
       * @return This builder for chaining.
       */
      public Builder clearId() {
        bitField0_ = (bitField0_ & ~0x00000001);
        id_ = 0;
        onChanged();
        return this;
      }

      private int ticks_ ;
      /**
       * <pre>
       * The number of meter ticks recorded for the drink.
       * </pre>
       *
       * <code>required uint32 ticks = 2;</code>
       * @return Whether the ticks field is set.
       */
      @java.lang.Override
      public boolean hasTicks() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <pre>
       * The number of meter ticks recorded for the drink.
       * </pre>
       *
       * <code>required uint32 ticks = 2;</code>
       * @return The ticks.
       */
      @java.lang.Override
      public int getTicks() {
        return ticks_;
      }
      /**
       * <pre>
       * The number of meter ticks recorded for the drink.
       * </pre>
       *
       * <code>required uint32 ticks = 2;</code>
       * @param value The ticks to set.
       * @return This builder for chaining.
       */
      public Builder setTicks(int value) {
        bitField0_ |= 0x00000002;
        ticks_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The number of meter ticks recorded for the drink.
       * </pre>
       *
       * <code>required uint32 ticks = 2;</code>
       * @return This builder for chaining.
       */
      public Builder clearTicks() {
        bitField0_ = (bitField0_ & ~0x00000002);
        ticks_ = 0;
        onChanged();
        return this;
      }

      private double volumeMl_ ;
      /**
       * <pre>
       * The volume of the drink, in milliliters.
       * </pre>
       *
       * <code>required double volume_ml = 3;</code>
       * @return Whether the volumeMl field is set.
       */
      @java.lang.Override
      public boolean hasVolumeMl() {
        return ((bitField0_ & 0x00000004) != 0);
      }
      /**
       * <pre>
       * The volume of the drink, in milliliters.
       * </pre>
       *
       * <code>required double volume_ml = 3;</code>
       * @return The volumeMl.
       */
      @java.lang.Override
      public double getVolumeMl() {
        return volumeMl_;
      }
      /**
       * <pre>
       * The volume of the drink, in milliliters.
       * </pre>
       *
       * <code>required double volume_ml = 3;</code>
       * @param value The volumeMl to set.
       * @return This builder for chaining.
       */
      public Builder setVolumeMl(double value) {
        bitField0_ |= 0x00000004;
        volumeMl_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The volume of the drink, in milliliters.
       * </pre>
       *
       * <code>required double volume_ml = 3;</code>
       * @return This builder for chaining.
       */
      public Builder clearVolumeMl() {
        bitField0_ = (bitField0_ & ~0x00000004);
        volumeMl_ = 0D;
        onChanged();
        return this;
      }

      private int sessionId_ ;
      /**
       * <pre>
       * The session this drink belongs to.
       * </pre>
       *
       * <code>required uint32 session_id = 4;</code>
       * @return Whether the sessionId field is set.
       */
      @java.lang.Override
      public boolean hasSessionId() {
        return ((bitField0_ & 0x00000008) != 0);
      }
      /**
       * <pre>
       * The session this drink belongs to.
       * </pre>
       *
       * <code>required uint32 session_id = 4;</code>
       * @return The sessionId.
       */
      @java.lang.Override
      public int getSessionId() {
        return sessionId_;
      }
      /**
       * <pre>
       * The session this drink belongs to.
       * </pre>
       *
       * <code>required uint32 session_id = 4;</code>
       * @param value The sessionId to set.
       * @return This builder for chaining.
       */
      public Builder setSessionId(int value) {
        bitField0_ |= 0x00000008;
        sessionId_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The session this drink belongs to.
       * </pre>
       *
       * <code>required uint32 session_id = 4;</code>
       * @return This builder for chaining.
       */
      public Builder clearSessionId() {
        bitField0_ = (bitField0_ & ~0x00000008);
        sessionId_ = 0;
        onChanged();
        return this;
      }

      private java.lang.Object time_ = "";
      /**
       * <pre>
       * UTC time when the drink was poured, as an ISO8061 UTC timestamp.
       * </pre>
       *
       * <code>required string time = 5;</code>
       * @return Whether the time field is set.
       */
      public boolean hasTime() {
        return ((bitField0_ & 0x00000010) != 0);
      }
      /**
       * <pre>
       * UTC time when the drink was poured, as an ISO8061 UTC timestamp.
       * </pre>
       *
       * <code>required string time = 5;</code>
       * @return The time.
       */
      public java.lang.String getTime() {
        java.lang.Object ref = time_;
        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()) {
            time_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * UTC time when the drink was poured, as an ISO8061 UTC timestamp.
       * </pre>
       *
       * <code>required string time = 5;</code>
       * @return The bytes for time.
       */
      public com.google.protobuf.ByteString
          getTimeBytes() {
        java.lang.Object ref = time_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          time_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * UTC time when the drink was poured, as an ISO8061 UTC timestamp.
       * </pre>
       *
       * <code>required string time = 5;</code>
       * @param value The time to set.
       * @return This builder for chaining.
       */
      public Builder setTime(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
        time_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * UTC time when the drink was poured, as an ISO8061 UTC timestamp.
       * </pre>
       *
       * <code>required string time = 5;</code>
       * @return This builder for chaining.
       */
      public Builder clearTime() {
        bitField0_ = (bitField0_ & ~0x00000010);
        time_ = getDefaultInstance().getTime();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * UTC time when the drink was poured, as an ISO8061 UTC timestamp.
       * </pre>
       *
       * <code>required string time = 5;</code>
       * @param value The bytes for time to set.
       * @return This builder for chaining.
       */
      public Builder setTimeBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
        time_ = value;
        onChanged();
        return this;
      }

      private int duration_ ;
      /**
       * <pre>
       * Duration, in seconds, of the pour.
       * </pre>
       *
       * <code>optional uint32 duration = 6;</code>
       * @return Whether the duration field is set.
       */
      @java.lang.Override
      public boolean hasDuration() {
        return ((bitField0_ & 0x00000020) != 0);
      }
      /**
       * <pre>
       * Duration, in seconds, of the pour.
       * </pre>
       *
       * <code>optional uint32 duration = 6;</code>
       * @return The duration.
       */
      @java.lang.Override
      public int getDuration() {
        return duration_;
      }
      /**
       * <pre>
       * Duration, in seconds, of the pour.
       * </pre>
       *
       * <code>optional uint32 duration = 6;</code>
       * @param value The duration to set.
       * @return This builder for chaining.
       */
      public Builder setDuration(int value) {
        bitField0_ |= 0x00000020;
        duration_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Duration, in seconds, of the pour.
       * </pre>
       *
       * <code>optional uint32 duration = 6;</code>
       * @return This builder for chaining.
       */
      public Builder clearDuration() {
        bitField0_ = (bitField0_ & ~0x00000020);
        duration_ = 0;
        onChanged();
        return this;
      }

      private int kegId_ ;
      /**
       * <pre>
       * The Keg from which the drink was poured.  May be unset if the drink was
       * not associated with a keg.
       * </pre>
       *
       * <code>optional uint32 keg_id = 8;</code>
       * @return Whether the kegId field is set.
       */
      @java.lang.Override
      public boolean hasKegId() {
        return ((bitField0_ & 0x00000040) != 0);
      }
      /**
       * <pre>
       * The Keg from which the drink was poured.  May be unset if the drink was
       * not associated with a keg.
       * </pre>
       *
       * <code>optional uint32 keg_id = 8;</code>
       * @return The kegId.
       */
      @java.lang.Override
      public int getKegId() {
        return kegId_;
      }
      /**
       * <pre>
       * The Keg from which the drink was poured.  May be unset if the drink was
       * not associated with a keg.
       * </pre>
       *
       * <code>optional uint32 keg_id = 8;</code>
       * @param value The kegId to set.
       * @return This builder for chaining.
       */
      public Builder setKegId(int value) {
        bitField0_ |= 0x00000040;
        kegId_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The Keg from which the drink was poured.  May be unset if the drink was
       * not associated with a keg.
       * </pre>
       *
       * <code>optional uint32 keg_id = 8;</code>
       * @return This builder for chaining.
       */
      public Builder clearKegId() {
        bitField0_ = (bitField0_ & ~0x00000040);
        kegId_ = 0;
        onChanged();
        return this;
      }

      private java.lang.Object userId_ = "";
      /**
       * <pre>
       * The User that poured the drink.  Snset if the drinker was unknown
       * (anonymous pour).
       * </pre>
       *
       * <code>optional string user_id = 9;</code>
       * @return Whether the userId field is set.
       */
      public boolean hasUserId() {
        return ((bitField0_ & 0x00000080) != 0);
      }
      /**
       * <pre>
       * The User that poured the drink.  Snset if the drinker was unknown
       * (anonymous pour).
       * </pre>
       *
       * <code>optional string user_id = 9;</code>
       * @return The userId.
       */
      public java.lang.String getUserId() {
        java.lang.Object ref = userId_;
        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()) {
            userId_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * The User that poured the drink.  Snset if the drinker was unknown
       * (anonymous pour).
       * </pre>
       *
       * <code>optional string user_id = 9;</code>
       * @return The bytes for userId.
       */
      public com.google.protobuf.ByteString
          getUserIdBytes() {
        java.lang.Object ref = userId_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          userId_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * The User that poured the drink.  Snset if the drinker was unknown
       * (anonymous pour).
       * </pre>
       *
       * <code>optional string user_id = 9;</code>
       * @param value The userId to set.
       * @return This builder for chaining.
       */
      public Builder setUserId(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000080;
        userId_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The User that poured the drink.  Snset if the drinker was unknown
       * (anonymous pour).
       * </pre>
       *
       * <code>optional string user_id = 9;</code>
       * @return This builder for chaining.
       */
      public Builder clearUserId() {
        bitField0_ = (bitField0_ & ~0x00000080);
        userId_ = getDefaultInstance().getUserId();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The User that poured the drink.  Snset if the drinker was unknown
       * (anonymous pour).
       * </pre>
       *
       * <code>optional string user_id = 9;</code>
       * @param value The bytes for userId to set.
       * @return This builder for chaining.
       */
      public Builder setUserIdBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000080;
        userId_ = value;
        onChanged();
        return this;
      }

      private int authTokenId_ ;
      /**
       * <pre>
       * Auth token value used to pour the drink, if known.
       * </pre>
       *
       * <code>optional uint32 auth_token_id = 10;</code>
       * @return Whether the authTokenId field is set.
       */
      @java.lang.Override
      public boolean hasAuthTokenId() {
        return ((bitField0_ & 0x00000100) != 0);
      }
      /**
       * <pre>
       * Auth token value used to pour the drink, if known.
       * </pre>
       *
       * <code>optional uint32 auth_token_id = 10;</code>
       * @return The authTokenId.
       */
      @java.lang.Override
      public int getAuthTokenId() {
        return authTokenId_;
      }
      /**
       * <pre>
       * Auth token value used to pour the drink, if known.
       * </pre>
       *
       * <code>optional uint32 auth_token_id = 10;</code>
       * @param value The authTokenId to set.
       * @return This builder for chaining.
       */
      public Builder setAuthTokenId(int value) {
        bitField0_ |= 0x00000100;
        authTokenId_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Auth token value used to pour the drink, if known.
       * </pre>
       *
       * <code>optional uint32 auth_token_id = 10;</code>
       * @return This builder for chaining.
       */
      public Builder clearAuthTokenId() {
        bitField0_ = (bitField0_ & ~0x00000100);
        authTokenId_ = 0;
        onChanged();
        return this;
      }

      private java.lang.Object url_ = "";
      /**
       * <pre>
       * Canonical URL for this object.
       * </pre>
       *
       * <code>optional string url = 11;</code>
       * @return Whether the url field is set.
       */
      public boolean hasUrl() {
        return ((bitField0_ & 0x00000200) != 0);
      }
      /**
       * <pre>
       * Canonical URL for this object.
       * </pre>
       *
       * <code>optional string url = 11;</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>
       * Canonical URL for this object.
       * </pre>
       *
       * <code>optional string url = 11;</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>
       * Canonical URL for this object.
       * </pre>
       *
       * <code>optional string url = 11;</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>
       * Canonical URL for this object.
       * </pre>
       *
       * <code>optional string url = 11;</code>
       * @return This builder for chaining.
       */
      public Builder clearUrl() {
        bitField0_ = (bitField0_ & ~0x00000200);
        url_ = getDefaultInstance().getUrl();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Canonical URL for this object.
       * </pre>
       *
       * <code>optional string url = 11;</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 java.lang.Object shout_ = "";
      /**
       * <pre>
       * Comment from the drinker at the time of the pour.
       * </pre>
       *
       * <code>optional string shout = 12;</code>
       * @return Whether the shout field is set.
       */
      public boolean hasShout() {
        return ((bitField0_ & 0x00000400) != 0);
      }
      /**
       * <pre>
       * Comment from the drinker at the time of the pour.
       * </pre>
       *
       * <code>optional string shout = 12;</code>
       * @return The shout.
       */
      public java.lang.String getShout() {
        java.lang.Object ref = shout_;
        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()) {
            shout_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * Comment from the drinker at the time of the pour.
       * </pre>
       *
       * <code>optional string shout = 12;</code>
       * @return The bytes for shout.
       */
      public com.google.protobuf.ByteString
          getShoutBytes() {
        java.lang.Object ref = shout_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          shout_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * Comment from the drinker at the time of the pour.
       * </pre>
       *
       * <code>optional string shout = 12;</code>
       * @param value The shout to set.
       * @return This builder for chaining.
       */
      public Builder setShout(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000400;
        shout_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Comment from the drinker at the time of the pour.
       * </pre>
       *
       * <code>optional string shout = 12;</code>
       * @return This builder for chaining.
       */
      public Builder clearShout() {
        bitField0_ = (bitField0_ & ~0x00000400);
        shout_ = getDefaultInstance().getShout();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Comment from the drinker at the time of the pour.
       * </pre>
       *
       * <code>optional string shout = 12;</code>
       * @param value The bytes for shout to set.
       * @return This builder for chaining.
       */
      public Builder setShoutBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000400;
        shout_ = value;
        onChanged();
        return this;
      }

      private org.kegbot.proto.Models.User user_;
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.User, org.kegbot.proto.Models.User.Builder, org.kegbot.proto.Models.UserOrBuilder> userBuilder_;
      /**
       * <code>optional .User user = 13;</code>
       * @return Whether the user field is set.
       */
      public boolean hasUser() {
        return ((bitField0_ & 0x00000800) != 0);
      }
      /**
       * <code>optional .User user = 13;</code>
       * @return The user.
       */
      public org.kegbot.proto.Models.User getUser() {
        if (userBuilder_ == null) {
          return user_ == null ? org.kegbot.proto.Models.User.getDefaultInstance() : user_;
        } else {
          return userBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .User user = 13;</code>
       */
      public Builder setUser(org.kegbot.proto.Models.User value) {
        if (userBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          user_ = value;
          onChanged();
        } else {
          userBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000800;
        return this;
      }
      /**
       * <code>optional .User user = 13;</code>
       */
      public Builder setUser(
          org.kegbot.proto.Models.User.Builder builderForValue) {
        if (userBuilder_ == null) {
          user_ = builderForValue.build();
          onChanged();
        } else {
          userBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000800;
        return this;
      }
      /**
       * <code>optional .User user = 13;</code>
       */
      public Builder mergeUser(org.kegbot.proto.Models.User value) {
        if (userBuilder_ == null) {
          if (((bitField0_ & 0x00000800) != 0) &&
              user_ != null &&
              user_ != org.kegbot.proto.Models.User.getDefaultInstance()) {
            user_ =
              org.kegbot.proto.Models.User.newBuilder(user_).mergeFrom(value).buildPartial();
          } else {
            user_ = value;
          }
          onChanged();
        } else {
          userBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000800;
        return this;
      }
      /**
       * <code>optional .User user = 13;</code>
       */
      public Builder clearUser() {
        if (userBuilder_ == null) {
          user_ = null;
          onChanged();
        } else {
          userBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000800);
        return this;
      }
      /**
       * <code>optional .User user = 13;</code>
       */
      public org.kegbot.proto.Models.User.Builder getUserBuilder() {
        bitField0_ |= 0x00000800;
        onChanged();
        return getUserFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .User user = 13;</code>
       */
      public org.kegbot.proto.Models.UserOrBuilder getUserOrBuilder() {
        if (userBuilder_ != null) {
          return userBuilder_.getMessageOrBuilder();
        } else {
          return user_ == null ?
              org.kegbot.proto.Models.User.getDefaultInstance() : user_;
        }
      }
      /**
       * <code>optional .User user = 13;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.User, org.kegbot.proto.Models.User.Builder, org.kegbot.proto.Models.UserOrBuilder> 
          getUserFieldBuilder() {
        if (userBuilder_ == null) {
          userBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              org.kegbot.proto.Models.User, org.kegbot.proto.Models.User.Builder, org.kegbot.proto.Models.UserOrBuilder>(
                  getUser(),
                  getParentForChildren(),
                  isClean());
          user_ = null;
        }
        return userBuilder_;
      }

      private org.kegbot.proto.Models.Keg keg_;
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.Keg, org.kegbot.proto.Models.Keg.Builder, org.kegbot.proto.Models.KegOrBuilder> kegBuilder_;
      /**
       * <code>optional .Keg keg = 14;</code>
       * @return Whether the keg field is set.
       */
      public boolean hasKeg() {
        return ((bitField0_ & 0x00001000) != 0);
      }
      /**
       * <code>optional .Keg keg = 14;</code>
       * @return The keg.
       */
      public org.kegbot.proto.Models.Keg getKeg() {
        if (kegBuilder_ == null) {
          return keg_ == null ? org.kegbot.proto.Models.Keg.getDefaultInstance() : keg_;
        } else {
          return kegBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .Keg keg = 14;</code>
       */
      public Builder setKeg(org.kegbot.proto.Models.Keg value) {
        if (kegBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          keg_ = value;
          onChanged();
        } else {
          kegBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00001000;
        return this;
      }
      /**
       * <code>optional .Keg keg = 14;</code>
       */
      public Builder setKeg(
          org.kegbot.proto.Models.Keg.Builder builderForValue) {
        if (kegBuilder_ == null) {
          keg_ = builderForValue.build();
          onChanged();
        } else {
          kegBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00001000;
        return this;
      }
      /**
       * <code>optional .Keg keg = 14;</code>
       */
      public Builder mergeKeg(org.kegbot.proto.Models.Keg value) {
        if (kegBuilder_ == null) {
          if (((bitField0_ & 0x00001000) != 0) &&
              keg_ != null &&
              keg_ != org.kegbot.proto.Models.Keg.getDefaultInstance()) {
            keg_ =
              org.kegbot.proto.Models.Keg.newBuilder(keg_).mergeFrom(value).buildPartial();
          } else {
            keg_ = value;
          }
          onChanged();
        } else {
          kegBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00001000;
        return this;
      }
      /**
       * <code>optional .Keg keg = 14;</code>
       */
      public Builder clearKeg() {
        if (kegBuilder_ == null) {
          keg_ = null;
          onChanged();
        } else {
          kegBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00001000);
        return this;
      }
      /**
       * <code>optional .Keg keg = 14;</code>
       */
      public org.kegbot.proto.Models.Keg.Builder getKegBuilder() {
        bitField0_ |= 0x00001000;
        onChanged();
        return getKegFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .Keg keg = 14;</code>
       */
      public org.kegbot.proto.Models.KegOrBuilder getKegOrBuilder() {
        if (kegBuilder_ != null) {
          return kegBuilder_.getMessageOrBuilder();
        } else {
          return keg_ == null ?
              org.kegbot.proto.Models.Keg.getDefaultInstance() : keg_;
        }
      }
      /**
       * <code>optional .Keg keg = 14;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.Keg, org.kegbot.proto.Models.Keg.Builder, org.kegbot.proto.Models.KegOrBuilder> 
          getKegFieldBuilder() {
        if (kegBuilder_ == null) {
          kegBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              org.kegbot.proto.Models.Keg, org.kegbot.proto.Models.Keg.Builder, org.kegbot.proto.Models.KegOrBuilder>(
                  getKeg(),
                  getParentForChildren(),
                  isClean());
          keg_ = null;
        }
        return kegBuilder_;
      }

      private org.kegbot.proto.Models.Session session_;
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.Session, org.kegbot.proto.Models.Session.Builder, org.kegbot.proto.Models.SessionOrBuilder> sessionBuilder_;
      /**
       * <code>optional .Session session = 15;</code>
       * @return Whether the session field is set.
       */
      public boolean hasSession() {
        return ((bitField0_ & 0x00002000) != 0);
      }
      /**
       * <code>optional .Session session = 15;</code>
       * @return The session.
       */
      public org.kegbot.proto.Models.Session getSession() {
        if (sessionBuilder_ == null) {
          return session_ == null ? org.kegbot.proto.Models.Session.getDefaultInstance() : session_;
        } else {
          return sessionBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .Session session = 15;</code>
       */
      public Builder setSession(org.kegbot.proto.Models.Session value) {
        if (sessionBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          session_ = value;
          onChanged();
        } else {
          sessionBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00002000;
        return this;
      }
      /**
       * <code>optional .Session session = 15;</code>
       */
      public Builder setSession(
          org.kegbot.proto.Models.Session.Builder builderForValue) {
        if (sessionBuilder_ == null) {
          session_ = builderForValue.build();
          onChanged();
        } else {
          sessionBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00002000;
        return this;
      }
      /**
       * <code>optional .Session session = 15;</code>
       */
      public Builder mergeSession(org.kegbot.proto.Models.Session value) {
        if (sessionBuilder_ == null) {
          if (((bitField0_ & 0x00002000) != 0) &&
              session_ != null &&
              session_ != org.kegbot.proto.Models.Session.getDefaultInstance()) {
            session_ =
              org.kegbot.proto.Models.Session.newBuilder(session_).mergeFrom(value).buildPartial();
          } else {
            session_ = value;
          }
          onChanged();
        } else {
          sessionBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00002000;
        return this;
      }
      /**
       * <code>optional .Session session = 15;</code>
       */
      public Builder clearSession() {
        if (sessionBuilder_ == null) {
          session_ = null;
          onChanged();
        } else {
          sessionBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00002000);
        return this;
      }
      /**
       * <code>optional .Session session = 15;</code>
       */
      public org.kegbot.proto.Models.Session.Builder getSessionBuilder() {
        bitField0_ |= 0x00002000;
        onChanged();
        return getSessionFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .Session session = 15;</code>
       */
      public org.kegbot.proto.Models.SessionOrBuilder getSessionOrBuilder() {
        if (sessionBuilder_ != null) {
          return sessionBuilder_.getMessageOrBuilder();
        } else {
          return session_ == null ?
              org.kegbot.proto.Models.Session.getDefaultInstance() : session_;
        }
      }
      /**
       * <code>optional .Session session = 15;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.Session, org.kegbot.proto.Models.Session.Builder, org.kegbot.proto.Models.SessionOrBuilder> 
          getSessionFieldBuilder() {
        if (sessionBuilder_ == null) {
          sessionBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              org.kegbot.proto.Models.Session, org.kegbot.proto.Models.Session.Builder, org.kegbot.proto.Models.SessionOrBuilder>(
                  getSession(),
                  getParentForChildren(),
                  isClean());
          session_ = null;
        }
        return sessionBuilder_;
      }

      private java.util.List<org.kegbot.proto.Models.Image> images_ =
        java.util.Collections.emptyList();
      private void ensureImagesIsMutable() {
        if (!((bitField0_ & 0x00004000) != 0)) {
          images_ = new java.util.ArrayList<org.kegbot.proto.Models.Image>(images_);
          bitField0_ |= 0x00004000;
         }
      }

      private com.google.protobuf.RepeatedFieldBuilderV3<
          org.kegbot.proto.Models.Image, org.kegbot.proto.Models.Image.Builder, org.kegbot.proto.Models.ImageOrBuilder> imagesBuilder_;

      /**
       * <code>repeated .Image images = 16;</code>
       */
      public java.util.List<org.kegbot.proto.Models.Image> getImagesList() {
        if (imagesBuilder_ == null) {
          return java.util.Collections.unmodifiableList(images_);
        } else {
          return imagesBuilder_.getMessageList();
        }
      }
      /**
       * <code>repeated .Image images = 16;</code>
       */
      public int getImagesCount() {
        if (imagesBuilder_ == null) {
          return images_.size();
        } else {
          return imagesBuilder_.getCount();
        }
      }
      /**
       * <code>repeated .Image images = 16;</code>
       */
      public org.kegbot.proto.Models.Image getImages(int index) {
        if (imagesBuilder_ == null) {
          return images_.get(index);
        } else {
          return imagesBuilder_.getMessage(index);
        }
      }
      /**
       * <code>repeated .Image images = 16;</code>
       */
      public Builder setImages(
          int index, org.kegbot.proto.Models.Image value) {
        if (imagesBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureImagesIsMutable();
          images_.set(index, value);
          onChanged();
        } else {
          imagesBuilder_.setMessage(index, value);
        }
        return this;
      }
      /**
       * <code>repeated .Image images = 16;</code>
       */
      public Builder setImages(
          int index, org.kegbot.proto.Models.Image.Builder builderForValue) {
        if (imagesBuilder_ == null) {
          ensureImagesIsMutable();
          images_.set(index, builderForValue.build());
          onChanged();
        } else {
          imagesBuilder_.setMessage(index, builderForValue.build());
        }
        return this;
      }
      /**
       * <code>repeated .Image images = 16;</code>
       */
      public Builder addImages(org.kegbot.proto.Models.Image value) {
        if (imagesBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureImagesIsMutable();
          images_.add(value);
          onChanged();
        } else {
          imagesBuilder_.addMessage(value);
        }
        return this;
      }
      /**
       * <code>repeated .Image images = 16;</code>
       */
      public Builder addImages(
          int index, org.kegbot.proto.Models.Image value) {
        if (imagesBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureImagesIsMutable();
          images_.add(index, value);
          onChanged();
        } else {
          imagesBuilder_.addMessage(index, value);
        }
        return this;
      }
      /**
       * <code>repeated .Image images = 16;</code>
       */
      public Builder addImages(
          org.kegbot.proto.Models.Image.Builder builderForValue) {
        if (imagesBuilder_ == null) {
          ensureImagesIsMutable();
          images_.add(builderForValue.build());
          onChanged();
        } else {
          imagesBuilder_.addMessage(builderForValue.build());
        }
        return this;
      }
      /**
       * <code>repeated .Image images = 16;</code>
       */
      public Builder addImages(
          int index, org.kegbot.proto.Models.Image.Builder builderForValue) {
        if (imagesBuilder_ == null) {
          ensureImagesIsMutable();
          images_.add(index, builderForValue.build());
          onChanged();
        } else {
          imagesBuilder_.addMessage(index, builderForValue.build());
        }
        return this;
      }
      /**
       * <code>repeated .Image images = 16;</code>
       */
      public Builder addAllImages(
          java.lang.Iterable<? extends org.kegbot.proto.Models.Image> values) {
        if (imagesBuilder_ == null) {
          ensureImagesIsMutable();
          com.google.protobuf.AbstractMessageLite.Builder.addAll(
              values, images_);
          onChanged();
        } else {
          imagesBuilder_.addAllMessages(values);
        }
        return this;
      }
      /**
       * <code>repeated .Image images = 16;</code>
       */
      public Builder clearImages() {
        if (imagesBuilder_ == null) {
          images_ = java.util.Collections.emptyList();
          bitField0_ = (bitField0_ & ~0x00004000);
          onChanged();
        } else {
          imagesBuilder_.clear();
        }
        return this;
      }
      /**
       * <code>repeated .Image images = 16;</code>
       */
      public Builder removeImages(int index) {
        if (imagesBuilder_ == null) {
          ensureImagesIsMutable();
          images_.remove(index);
          onChanged();
        } else {
          imagesBuilder_.remove(index);
        }
        return this;
      }
      /**
       * <code>repeated .Image images = 16;</code>
       */
      public org.kegbot.proto.Models.Image.Builder getImagesBuilder(
          int index) {
        return getImagesFieldBuilder().getBuilder(index);
      }
      /**
       * <code>repeated .Image images = 16;</code>
       */
      public org.kegbot.proto.Models.ImageOrBuilder getImagesOrBuilder(
          int index) {
        if (imagesBuilder_ == null) {
          return images_.get(index);  } else {
          return imagesBuilder_.getMessageOrBuilder(index);
        }
      }
      /**
       * <code>repeated .Image images = 16;</code>
       */
      public java.util.List<? extends org.kegbot.proto.Models.ImageOrBuilder> 
           getImagesOrBuilderList() {
        if (imagesBuilder_ != null) {
          return imagesBuilder_.getMessageOrBuilderList();
        } else {
          return java.util.Collections.unmodifiableList(images_);
        }
      }
      /**
       * <code>repeated .Image images = 16;</code>
       */
      public org.kegbot.proto.Models.Image.Builder addImagesBuilder() {
        return getImagesFieldBuilder().addBuilder(
            org.kegbot.proto.Models.Image.getDefaultInstance());
      }
      /**
       * <code>repeated .Image images = 16;</code>
       */
      public org.kegbot.proto.Models.Image.Builder addImagesBuilder(
          int index) {
        return getImagesFieldBuilder().addBuilder(
            index, org.kegbot.proto.Models.Image.getDefaultInstance());
      }
      /**
       * <code>repeated .Image images = 16;</code>
       */
      public java.util.List<org.kegbot.proto.Models.Image.Builder> 
           getImagesBuilderList() {
        return getImagesFieldBuilder().getBuilderList();
      }
      private com.google.protobuf.RepeatedFieldBuilderV3<
          org.kegbot.proto.Models.Image, org.kegbot.proto.Models.Image.Builder, org.kegbot.proto.Models.ImageOrBuilder> 
          getImagesFieldBuilder() {
        if (imagesBuilder_ == null) {
          imagesBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
              org.kegbot.proto.Models.Image, org.kegbot.proto.Models.Image.Builder, org.kegbot.proto.Models.ImageOrBuilder>(
                  images_,
                  ((bitField0_ & 0x00004000) != 0),
                  getParentForChildren(),
                  isClean());
          images_ = null;
        }
        return imagesBuilder_;
      }

      private java.lang.Object tickTimeSeries_ = "";
      /**
       * <pre>
       * Vector of tick updates. Format is: "&lt;time&gt;:&lt;amount&gt; [&lt;time&gt;:&lt;amount&gt; ...]",
       * where "time" is the delta (in ms) from the previous reading, and "amount"
       * is the delta in ticks from the previous reading.
       * </pre>
       *
       * <code>optional string tick_time_series = 17;</code>
       * @return Whether the tickTimeSeries field is set.
       */
      public boolean hasTickTimeSeries() {
        return ((bitField0_ & 0x00008000) != 0);
      }
      /**
       * <pre>
       * Vector of tick updates. Format is: "&lt;time&gt;:&lt;amount&gt; [&lt;time&gt;:&lt;amount&gt; ...]",
       * where "time" is the delta (in ms) from the previous reading, and "amount"
       * is the delta in ticks from the previous reading.
       * </pre>
       *
       * <code>optional string tick_time_series = 17;</code>
       * @return The tickTimeSeries.
       */
      public java.lang.String getTickTimeSeries() {
        java.lang.Object ref = tickTimeSeries_;
        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()) {
            tickTimeSeries_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * Vector of tick updates. Format is: "&lt;time&gt;:&lt;amount&gt; [&lt;time&gt;:&lt;amount&gt; ...]",
       * where "time" is the delta (in ms) from the previous reading, and "amount"
       * is the delta in ticks from the previous reading.
       * </pre>
       *
       * <code>optional string tick_time_series = 17;</code>
       * @return The bytes for tickTimeSeries.
       */
      public com.google.protobuf.ByteString
          getTickTimeSeriesBytes() {
        java.lang.Object ref = tickTimeSeries_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          tickTimeSeries_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * Vector of tick updates. Format is: "&lt;time&gt;:&lt;amount&gt; [&lt;time&gt;:&lt;amount&gt; ...]",
       * where "time" is the delta (in ms) from the previous reading, and "amount"
       * is the delta in ticks from the previous reading.
       * </pre>
       *
       * <code>optional string tick_time_series = 17;</code>
       * @param value The tickTimeSeries to set.
       * @return This builder for chaining.
       */
      public Builder setTickTimeSeries(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00008000;
        tickTimeSeries_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Vector of tick updates. Format is: "&lt;time&gt;:&lt;amount&gt; [&lt;time&gt;:&lt;amount&gt; ...]",
       * where "time" is the delta (in ms) from the previous reading, and "amount"
       * is the delta in ticks from the previous reading.
       * </pre>
       *
       * <code>optional string tick_time_series = 17;</code>
       * @return This builder for chaining.
       */
      public Builder clearTickTimeSeries() {
        bitField0_ = (bitField0_ & ~0x00008000);
        tickTimeSeries_ = getDefaultInstance().getTickTimeSeries();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Vector of tick updates. Format is: "&lt;time&gt;:&lt;amount&gt; [&lt;time&gt;:&lt;amount&gt; ...]",
       * where "time" is the delta (in ms) from the previous reading, and "amount"
       * is the delta in ticks from the previous reading.
       * </pre>
       *
       * <code>optional string tick_time_series = 17;</code>
       * @param value The bytes for tickTimeSeries to set.
       * @return This builder for chaining.
       */
      public Builder setTickTimeSeriesBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00008000;
        tickTimeSeries_ = 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:Drink)
    }

    // @@protoc_insertion_point(class_scope:Drink)
    private static final org.kegbot.proto.Models.Drink DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new org.kegbot.proto.Models.Drink();
    }

    public static org.kegbot.proto.Models.Drink getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

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

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

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

    @java.lang.Override
    public org.kegbot.proto.Models.Drink getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface ImageOrBuilder extends
      // @@protoc_insertion_point(interface_extends:Image)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <pre>
     * The default URL of this image.
     * </pre>
     *
     * <code>required string url = 1;</code>
     * @return Whether the url field is set.
     */
    boolean hasUrl();
    /**
     * <pre>
     * The default URL of this image.
     * </pre>
     *
     * <code>required string url = 1;</code>
     * @return The url.
     */
    java.lang.String getUrl();
    /**
     * <pre>
     * The default URL of this image.
     * </pre>
     *
     * <code>required string url = 1;</code>
     * @return The bytes for url.
     */
    com.google.protobuf.ByteString
        getUrlBytes();

    /**
     * <pre>
     * The width of the image in pixels.
     * </pre>
     *
     * <code>optional uint32 width = 2;</code>
     * @return Whether the width field is set.
     */
    boolean hasWidth();
    /**
     * <pre>
     * The width of the image in pixels.
     * </pre>
     *
     * <code>optional uint32 width = 2;</code>
     * @return The width.
     */
    int getWidth();

    /**
     * <pre>
     * The height of the image in pixels.
     * </pre>
     *
     * <code>optional uint32 height = 3;</code>
     * @return Whether the height field is set.
     */
    boolean hasHeight();
    /**
     * <pre>
     * The height of the image in pixels.
     * </pre>
     *
     * <code>optional uint32 height = 3;</code>
     * @return The height.
     */
    int getHeight();

    /**
     * <pre>
     * The date the picture was created.
     * </pre>
     *
     * <code>optional string time = 4;</code>
     * @return Whether the time field is set.
     */
    boolean hasTime();
    /**
     * <pre>
     * The date the picture was created.
     * </pre>
     *
     * <code>optional string time = 4;</code>
     * @return The time.
     */
    java.lang.String getTime();
    /**
     * <pre>
     * The date the picture was created.
     * </pre>
     *
     * <code>optional string time = 4;</code>
     * @return The bytes for time.
     */
    com.google.protobuf.ByteString
        getTimeBytes();

    /**
     * <pre>
     * The caption, if any.
     * </pre>
     *
     * <code>optional string caption = 5;</code>
     * @return Whether the caption field is set.
     */
    boolean hasCaption();
    /**
     * <pre>
     * The caption, if any.
     * </pre>
     *
     * <code>optional string caption = 5;</code>
     * @return The caption.
     */
    java.lang.String getCaption();
    /**
     * <pre>
     * The caption, if any.
     * </pre>
     *
     * <code>optional string caption = 5;</code>
     * @return The bytes for caption.
     */
    com.google.protobuf.ByteString
        getCaptionBytes();

    /**
     * <pre>
     * The user associated with this picture, if any.
     * </pre>
     *
     * <code>optional string user_id = 6;</code>
     * @return Whether the userId field is set.
     */
    boolean hasUserId();
    /**
     * <pre>
     * The user associated with this picture, if any.
     * </pre>
     *
     * <code>optional string user_id = 6;</code>
     * @return The userId.
     */
    java.lang.String getUserId();
    /**
     * <pre>
     * The user associated with this picture, if any.
     * </pre>
     *
     * <code>optional string user_id = 6;</code>
     * @return The bytes for userId.
     */
    com.google.protobuf.ByteString
        getUserIdBytes();

    /**
     * <pre>
     * The keg associated with this picture, if any.
     * </pre>
     *
     * <code>optional uint32 keg_id = 7;</code>
     * @return Whether the kegId field is set.
     */
    boolean hasKegId();
    /**
     * <pre>
     * The keg associated with this picture, if any.
     * </pre>
     *
     * <code>optional uint32 keg_id = 7;</code>
     * @return The kegId.
     */
    int getKegId();

    /**
     * <pre>
     * The session associated with this picture, if any.
     * </pre>
     *
     * <code>optional uint32 session_id = 8;</code>
     * @return Whether the sessionId field is set.
     */
    boolean hasSessionId();
    /**
     * <pre>
     * The session associated with this picture, if any.
     * </pre>
     *
     * <code>optional uint32 session_id = 8;</code>
     * @return The sessionId.
     */
    int getSessionId();

    /**
     * <pre>
     * The drink associated with this picture, if any.
     * </pre>
     *
     * <code>optional uint32 drink_id = 9;</code>
     * @return Whether the drinkId field is set.
     */
    boolean hasDrinkId();
    /**
     * <pre>
     * The drink associated with this picture, if any.
     * </pre>
     *
     * <code>optional uint32 drink_id = 9;</code>
     * @return The drinkId.
     */
    int getDrinkId();

    /**
     * <code>optional string thumbnail_url = 10;</code>
     * @return Whether the thumbnailUrl field is set.
     */
    boolean hasThumbnailUrl();
    /**
     * <code>optional string thumbnail_url = 10;</code>
     * @return The thumbnailUrl.
     */
    java.lang.String getThumbnailUrl();
    /**
     * <code>optional string thumbnail_url = 10;</code>
     * @return The bytes for thumbnailUrl.
     */
    com.google.protobuf.ByteString
        getThumbnailUrlBytes();

    /**
     * <code>optional string original_url = 11;</code>
     * @return Whether the originalUrl field is set.
     */
    boolean hasOriginalUrl();
    /**
     * <code>optional string original_url = 11;</code>
     * @return The originalUrl.
     */
    java.lang.String getOriginalUrl();
    /**
     * <code>optional string original_url = 11;</code>
     * @return The bytes for originalUrl.
     */
    com.google.protobuf.ByteString
        getOriginalUrlBytes();

    /**
     * <code>optional string small_resized_url = 13;</code>
     * @return Whether the smallResizedUrl field is set.
     */
    boolean hasSmallResizedUrl();
    /**
     * <code>optional string small_resized_url = 13;</code>
     * @return The smallResizedUrl.
     */
    java.lang.String getSmallResizedUrl();
    /**
     * <code>optional string small_resized_url = 13;</code>
     * @return The bytes for smallResizedUrl.
     */
    com.google.protobuf.ByteString
        getSmallResizedUrlBytes();
  }
  /**
   * <pre>
   * Describes an image.
   * </pre>
   *
   * Protobuf type {@code Image}
   */
  public static final class Image extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:Image)
      ImageOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use Image.newBuilder() to construct.
    private Image(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private Image() {
      url_ = "";
      time_ = "";
      caption_ = "";
      userId_ = "";
      thumbnailUrl_ = "";
      originalUrl_ = "";
      smallResizedUrl_ = "";
    }

    @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;
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return org.kegbot.proto.Models.internal_static_Image_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return org.kegbot.proto.Models.internal_static_Image_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              org.kegbot.proto.Models.Image.class, org.kegbot.proto.Models.Image.Builder.class);
    }

    private int bitField0_;
    public static final int URL_FIELD_NUMBER = 1;
    private volatile java.lang.Object url_;
    /**
     * <pre>
     * The default URL of this image.
     * </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>
     * The default URL of this image.
     * </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>
     * The default URL of this image.
     * </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 WIDTH_FIELD_NUMBER = 2;
    private int width_;
    /**
     * <pre>
     * The width of the image in pixels.
     * </pre>
     *
     * <code>optional uint32 width = 2;</code>
     * @return Whether the width field is set.
     */
    @java.lang.Override
    public boolean hasWidth() {
      return ((bitField0_ & 0x00000002) != 0);
    }
    /**
     * <pre>
     * The width of the image in pixels.
     * </pre>
     *
     * <code>optional uint32 width = 2;</code>
     * @return The width.
     */
    @java.lang.Override
    public int getWidth() {
      return width_;
    }

    public static final int HEIGHT_FIELD_NUMBER = 3;
    private int height_;
    /**
     * <pre>
     * The height of the image in pixels.
     * </pre>
     *
     * <code>optional uint32 height = 3;</code>
     * @return Whether the height field is set.
     */
    @java.lang.Override
    public boolean hasHeight() {
      return ((bitField0_ & 0x00000004) != 0);
    }
    /**
     * <pre>
     * The height of the image in pixels.
     * </pre>
     *
     * <code>optional uint32 height = 3;</code>
     * @return The height.
     */
    @java.lang.Override
    public int getHeight() {
      return height_;
    }

    public static final int TIME_FIELD_NUMBER = 4;
    private volatile java.lang.Object time_;
    /**
     * <pre>
     * The date the picture was created.
     * </pre>
     *
     * <code>optional string time = 4;</code>
     * @return Whether the time field is set.
     */
    @java.lang.Override
    public boolean hasTime() {
      return ((bitField0_ & 0x00000008) != 0);
    }
    /**
     * <pre>
     * The date the picture was created.
     * </pre>
     *
     * <code>optional string time = 4;</code>
     * @return The time.
     */
    @java.lang.Override
    public java.lang.String getTime() {
      java.lang.Object ref = time_;
      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()) {
          time_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * The date the picture was created.
     * </pre>
     *
     * <code>optional string time = 4;</code>
     * @return The bytes for time.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getTimeBytes() {
      java.lang.Object ref = time_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        time_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int CAPTION_FIELD_NUMBER = 5;
    private volatile java.lang.Object caption_;
    /**
     * <pre>
     * The caption, if any.
     * </pre>
     *
     * <code>optional string caption = 5;</code>
     * @return Whether the caption field is set.
     */
    @java.lang.Override
    public boolean hasCaption() {
      return ((bitField0_ & 0x00000010) != 0);
    }
    /**
     * <pre>
     * The caption, if any.
     * </pre>
     *
     * <code>optional string caption = 5;</code>
     * @return The caption.
     */
    @java.lang.Override
    public java.lang.String getCaption() {
      java.lang.Object ref = caption_;
      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()) {
          caption_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * The caption, if any.
     * </pre>
     *
     * <code>optional string caption = 5;</code>
     * @return The bytes for caption.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getCaptionBytes() {
      java.lang.Object ref = caption_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        caption_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int USER_ID_FIELD_NUMBER = 6;
    private volatile java.lang.Object userId_;
    /**
     * <pre>
     * The user associated with this picture, if any.
     * </pre>
     *
     * <code>optional string user_id = 6;</code>
     * @return Whether the userId field is set.
     */
    @java.lang.Override
    public boolean hasUserId() {
      return ((bitField0_ & 0x00000020) != 0);
    }
    /**
     * <pre>
     * The user associated with this picture, if any.
     * </pre>
     *
     * <code>optional string user_id = 6;</code>
     * @return The userId.
     */
    @java.lang.Override
    public java.lang.String getUserId() {
      java.lang.Object ref = userId_;
      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()) {
          userId_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * The user associated with this picture, if any.
     * </pre>
     *
     * <code>optional string user_id = 6;</code>
     * @return The bytes for userId.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getUserIdBytes() {
      java.lang.Object ref = userId_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        userId_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int KEG_ID_FIELD_NUMBER = 7;
    private int kegId_;
    /**
     * <pre>
     * The keg associated with this picture, if any.
     * </pre>
     *
     * <code>optional uint32 keg_id = 7;</code>
     * @return Whether the kegId field is set.
     */
    @java.lang.Override
    public boolean hasKegId() {
      return ((bitField0_ & 0x00000040) != 0);
    }
    /**
     * <pre>
     * The keg associated with this picture, if any.
     * </pre>
     *
     * <code>optional uint32 keg_id = 7;</code>
     * @return The kegId.
     */
    @java.lang.Override
    public int getKegId() {
      return kegId_;
    }

    public static final int SESSION_ID_FIELD_NUMBER = 8;
    private int sessionId_;
    /**
     * <pre>
     * The session associated with this picture, if any.
     * </pre>
     *
     * <code>optional uint32 session_id = 8;</code>
     * @return Whether the sessionId field is set.
     */
    @java.lang.Override
    public boolean hasSessionId() {
      return ((bitField0_ & 0x00000080) != 0);
    }
    /**
     * <pre>
     * The session associated with this picture, if any.
     * </pre>
     *
     * <code>optional uint32 session_id = 8;</code>
     * @return The sessionId.
     */
    @java.lang.Override
    public int getSessionId() {
      return sessionId_;
    }

    public static final int DRINK_ID_FIELD_NUMBER = 9;
    private int drinkId_;
    /**
     * <pre>
     * The drink associated with this picture, if any.
     * </pre>
     *
     * <code>optional uint32 drink_id = 9;</code>
     * @return Whether the drinkId field is set.
     */
    @java.lang.Override
    public boolean hasDrinkId() {
      return ((bitField0_ & 0x00000100) != 0);
    }
    /**
     * <pre>
     * The drink associated with this picture, if any.
     * </pre>
     *
     * <code>optional uint32 drink_id = 9;</code>
     * @return The drinkId.
     */
    @java.lang.Override
    public int getDrinkId() {
      return drinkId_;
    }

    public static final int THUMBNAIL_URL_FIELD_NUMBER = 10;
    private volatile java.lang.Object thumbnailUrl_;
    /**
     * <code>optional string thumbnail_url = 10;</code>
     * @return Whether the thumbnailUrl field is set.
     */
    @java.lang.Override
    public boolean hasThumbnailUrl() {
      return ((bitField0_ & 0x00000200) != 0);
    }
    /**
     * <code>optional string thumbnail_url = 10;</code>
     * @return The thumbnailUrl.
     */
    @java.lang.Override
    public java.lang.String getThumbnailUrl() {
      java.lang.Object ref = thumbnailUrl_;
      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()) {
          thumbnailUrl_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string thumbnail_url = 10;</code>
     * @return The bytes for thumbnailUrl.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getThumbnailUrlBytes() {
      java.lang.Object ref = thumbnailUrl_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        thumbnailUrl_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int ORIGINAL_URL_FIELD_NUMBER = 11;
    private volatile java.lang.Object originalUrl_;
    /**
     * <code>optional string original_url = 11;</code>
     * @return Whether the originalUrl field is set.
     */
    @java.lang.Override
    public boolean hasOriginalUrl() {
      return ((bitField0_ & 0x00000400) != 0);
    }
    /**
     * <code>optional string original_url = 11;</code>
     * @return The originalUrl.
     */
    @java.lang.Override
    public java.lang.String getOriginalUrl() {
      java.lang.Object ref = originalUrl_;
      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()) {
          originalUrl_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string original_url = 11;</code>
     * @return The bytes for originalUrl.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getOriginalUrlBytes() {
      java.lang.Object ref = originalUrl_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        originalUrl_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int SMALL_RESIZED_URL_FIELD_NUMBER = 13;
    private volatile java.lang.Object smallResizedUrl_;
    /**
     * <code>optional string small_resized_url = 13;</code>
     * @return Whether the smallResizedUrl field is set.
     */
    @java.lang.Override
    public boolean hasSmallResizedUrl() {
      return ((bitField0_ & 0x00000800) != 0);
    }
    /**
     * <code>optional string small_resized_url = 13;</code>
     * @return The smallResizedUrl.
     */
    @java.lang.Override
    public java.lang.String getSmallResizedUrl() {
      java.lang.Object ref = smallResizedUrl_;
      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()) {
          smallResizedUrl_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string small_resized_url = 13;</code>
     * @return The bytes for smallResizedUrl.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getSmallResizedUrlBytes() {
      java.lang.Object ref = smallResizedUrl_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        smallResizedUrl_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static org.kegbot.proto.Models.Image parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.Image parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.Image parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.Image parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.Image parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.Image parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.Image parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.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 org.kegbot.proto.Models.Image parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.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 org.kegbot.proto.Models.Image parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.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(org.kegbot.proto.Models.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>
     * Describes an image.
     * </pre>
     *
     * Protobuf type {@code Image}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:Image)
        org.kegbot.proto.Models.ImageOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return org.kegbot.proto.Models.internal_static_Image_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return org.kegbot.proto.Models.internal_static_Image_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                org.kegbot.proto.Models.Image.class, org.kegbot.proto.Models.Image.Builder.class);
      }

      // Construct using org.kegbot.proto.Models.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();
        url_ = "";
        bitField0_ = (bitField0_ & ~0x00000001);
        width_ = 0;
        bitField0_ = (bitField0_ & ~0x00000002);
        height_ = 0;
        bitField0_ = (bitField0_ & ~0x00000004);
        time_ = "";
        bitField0_ = (bitField0_ & ~0x00000008);
        caption_ = "";
        bitField0_ = (bitField0_ & ~0x00000010);
        userId_ = "";
        bitField0_ = (bitField0_ & ~0x00000020);
        kegId_ = 0;
        bitField0_ = (bitField0_ & ~0x00000040);
        sessionId_ = 0;
        bitField0_ = (bitField0_ & ~0x00000080);
        drinkId_ = 0;
        bitField0_ = (bitField0_ & ~0x00000100);
        thumbnailUrl_ = "";
        bitField0_ = (bitField0_ & ~0x00000200);
        originalUrl_ = "";
        bitField0_ = (bitField0_ & ~0x00000400);
        smallResizedUrl_ = "";
        bitField0_ = (bitField0_ & ~0x00000800);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return org.kegbot.proto.Models.internal_static_Image_descriptor;
      }

      @java.lang.Override
      public org.kegbot.proto.Models.Image getDefaultInstanceForType() {
        return org.kegbot.proto.Models.Image.getDefaultInstance();
      }

      @java.lang.Override
      public org.kegbot.proto.Models.Image build() {
        org.kegbot.proto.Models.Image result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public org.kegbot.proto.Models.Image buildPartial() {
        org.kegbot.proto.Models.Image result = new org.kegbot.proto.Models.Image(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) != 0)) {
          to_bitField0_ |= 0x00000001;
        }
        result.url_ = url_;
        if (((from_bitField0_ & 0x00000002) != 0)) {
          result.width_ = width_;
          to_bitField0_ |= 0x00000002;
        }
        if (((from_bitField0_ & 0x00000004) != 0)) {
          result.height_ = height_;
          to_bitField0_ |= 0x00000004;
        }
        if (((from_bitField0_ & 0x00000008) != 0)) {
          to_bitField0_ |= 0x00000008;
        }
        result.time_ = time_;
        if (((from_bitField0_ & 0x00000010) != 0)) {
          to_bitField0_ |= 0x00000010;
        }
        result.caption_ = caption_;
        if (((from_bitField0_ & 0x00000020) != 0)) {
          to_bitField0_ |= 0x00000020;
        }
        result.userId_ = userId_;
        if (((from_bitField0_ & 0x00000040) != 0)) {
          result.kegId_ = kegId_;
          to_bitField0_ |= 0x00000040;
        }
        if (((from_bitField0_ & 0x00000080) != 0)) {
          result.sessionId_ = sessionId_;
          to_bitField0_ |= 0x00000080;
        }
        if (((from_bitField0_ & 0x00000100) != 0)) {
          result.drinkId_ = drinkId_;
          to_bitField0_ |= 0x00000100;
        }
        if (((from_bitField0_ & 0x00000200) != 0)) {
          to_bitField0_ |= 0x00000200;
        }
        result.thumbnailUrl_ = thumbnailUrl_;
        if (((from_bitField0_ & 0x00000400) != 0)) {
          to_bitField0_ |= 0x00000400;
        }
        result.originalUrl_ = originalUrl_;
        if (((from_bitField0_ & 0x00000800) != 0)) {
          to_bitField0_ |= 0x00000800;
        }
        result.smallResizedUrl_ = smallResizedUrl_;
        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);
      }
      private int bitField0_;

      private java.lang.Object url_ = "";
      /**
       * <pre>
       * The default URL of this image.
       * </pre>
       *
       * <code>required string url = 1;</code>
       * @return Whether the url field is set.
       */
      public boolean hasUrl() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <pre>
       * The default URL of this image.
       * </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>
       * The default URL of this image.
       * </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>
       * The default URL of this image.
       * </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>
       * The default URL of this image.
       * </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>
       * The default URL of this image.
       * </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 int width_ ;
      /**
       * <pre>
       * The width of the image in pixels.
       * </pre>
       *
       * <code>optional uint32 width = 2;</code>
       * @return Whether the width field is set.
       */
      @java.lang.Override
      public boolean hasWidth() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <pre>
       * The width of the image in pixels.
       * </pre>
       *
       * <code>optional uint32 width = 2;</code>
       * @return The width.
       */
      @java.lang.Override
      public int getWidth() {
        return width_;
      }
      /**
       * <pre>
       * The width of the image in pixels.
       * </pre>
       *
       * <code>optional uint32 width = 2;</code>
       * @param value The width to set.
       * @return This builder for chaining.
       */
      public Builder setWidth(int value) {
        bitField0_ |= 0x00000002;
        width_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The width of the image in pixels.
       * </pre>
       *
       * <code>optional uint32 width = 2;</code>
       * @return This builder for chaining.
       */
      public Builder clearWidth() {
        bitField0_ = (bitField0_ & ~0x00000002);
        width_ = 0;
        onChanged();
        return this;
      }

      private int height_ ;
      /**
       * <pre>
       * The height of the image in pixels.
       * </pre>
       *
       * <code>optional uint32 height = 3;</code>
       * @return Whether the height field is set.
       */
      @java.lang.Override
      public boolean hasHeight() {
        return ((bitField0_ & 0x00000004) != 0);
      }
      /**
       * <pre>
       * The height of the image in pixels.
       * </pre>
       *
       * <code>optional uint32 height = 3;</code>
       * @return The height.
       */
      @java.lang.Override
      public int getHeight() {
        return height_;
      }
      /**
       * <pre>
       * The height of the image in pixels.
       * </pre>
       *
       * <code>optional uint32 height = 3;</code>
       * @param value The height to set.
       * @return This builder for chaining.
       */
      public Builder setHeight(int value) {
        bitField0_ |= 0x00000004;
        height_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The height of the image in pixels.
       * </pre>
       *
       * <code>optional uint32 height = 3;</code>
       * @return This builder for chaining.
       */
      public Builder clearHeight() {
        bitField0_ = (bitField0_ & ~0x00000004);
        height_ = 0;
        onChanged();
        return this;
      }

      private java.lang.Object time_ = "";
      /**
       * <pre>
       * The date the picture was created.
       * </pre>
       *
       * <code>optional string time = 4;</code>
       * @return Whether the time field is set.
       */
      public boolean hasTime() {
        return ((bitField0_ & 0x00000008) != 0);
      }
      /**
       * <pre>
       * The date the picture was created.
       * </pre>
       *
       * <code>optional string time = 4;</code>
       * @return The time.
       */
      public java.lang.String getTime() {
        java.lang.Object ref = time_;
        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()) {
            time_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * The date the picture was created.
       * </pre>
       *
       * <code>optional string time = 4;</code>
       * @return The bytes for time.
       */
      public com.google.protobuf.ByteString
          getTimeBytes() {
        java.lang.Object ref = time_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          time_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * The date the picture was created.
       * </pre>
       *
       * <code>optional string time = 4;</code>
       * @param value The time to set.
       * @return This builder for chaining.
       */
      public Builder setTime(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
        time_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The date the picture was created.
       * </pre>
       *
       * <code>optional string time = 4;</code>
       * @return This builder for chaining.
       */
      public Builder clearTime() {
        bitField0_ = (bitField0_ & ~0x00000008);
        time_ = getDefaultInstance().getTime();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The date the picture was created.
       * </pre>
       *
       * <code>optional string time = 4;</code>
       * @param value The bytes for time to set.
       * @return This builder for chaining.
       */
      public Builder setTimeBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
        time_ = value;
        onChanged();
        return this;
      }

      private java.lang.Object caption_ = "";
      /**
       * <pre>
       * The caption, if any.
       * </pre>
       *
       * <code>optional string caption = 5;</code>
       * @return Whether the caption field is set.
       */
      public boolean hasCaption() {
        return ((bitField0_ & 0x00000010) != 0);
      }
      /**
       * <pre>
       * The caption, if any.
       * </pre>
       *
       * <code>optional string caption = 5;</code>
       * @return The caption.
       */
      public java.lang.String getCaption() {
        java.lang.Object ref = caption_;
        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()) {
            caption_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * The caption, if any.
       * </pre>
       *
       * <code>optional string caption = 5;</code>
       * @return The bytes for caption.
       */
      public com.google.protobuf.ByteString
          getCaptionBytes() {
        java.lang.Object ref = caption_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          caption_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * The caption, if any.
       * </pre>
       *
       * <code>optional string caption = 5;</code>
       * @param value The caption to set.
       * @return This builder for chaining.
       */
      public Builder setCaption(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
        caption_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The caption, if any.
       * </pre>
       *
       * <code>optional string caption = 5;</code>
       * @return This builder for chaining.
       */
      public Builder clearCaption() {
        bitField0_ = (bitField0_ & ~0x00000010);
        caption_ = getDefaultInstance().getCaption();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The caption, if any.
       * </pre>
       *
       * <code>optional string caption = 5;</code>
       * @param value The bytes for caption to set.
       * @return This builder for chaining.
       */
      public Builder setCaptionBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
        caption_ = value;
        onChanged();
        return this;
      }

      private java.lang.Object userId_ = "";
      /**
       * <pre>
       * The user associated with this picture, if any.
       * </pre>
       *
       * <code>optional string user_id = 6;</code>
       * @return Whether the userId field is set.
       */
      public boolean hasUserId() {
        return ((bitField0_ & 0x00000020) != 0);
      }
      /**
       * <pre>
       * The user associated with this picture, if any.
       * </pre>
       *
       * <code>optional string user_id = 6;</code>
       * @return The userId.
       */
      public java.lang.String getUserId() {
        java.lang.Object ref = userId_;
        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()) {
            userId_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * The user associated with this picture, if any.
       * </pre>
       *
       * <code>optional string user_id = 6;</code>
       * @return The bytes for userId.
       */
      public com.google.protobuf.ByteString
          getUserIdBytes() {
        java.lang.Object ref = userId_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          userId_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * The user associated with this picture, if any.
       * </pre>
       *
       * <code>optional string user_id = 6;</code>
       * @param value The userId to set.
       * @return This builder for chaining.
       */
      public Builder setUserId(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000020;
        userId_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The user associated with this picture, if any.
       * </pre>
       *
       * <code>optional string user_id = 6;</code>
       * @return This builder for chaining.
       */
      public Builder clearUserId() {
        bitField0_ = (bitField0_ & ~0x00000020);
        userId_ = getDefaultInstance().getUserId();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The user associated with this picture, if any.
       * </pre>
       *
       * <code>optional string user_id = 6;</code>
       * @param value The bytes for userId to set.
       * @return This builder for chaining.
       */
      public Builder setUserIdBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000020;
        userId_ = value;
        onChanged();
        return this;
      }

      private int kegId_ ;
      /**
       * <pre>
       * The keg associated with this picture, if any.
       * </pre>
       *
       * <code>optional uint32 keg_id = 7;</code>
       * @return Whether the kegId field is set.
       */
      @java.lang.Override
      public boolean hasKegId() {
        return ((bitField0_ & 0x00000040) != 0);
      }
      /**
       * <pre>
       * The keg associated with this picture, if any.
       * </pre>
       *
       * <code>optional uint32 keg_id = 7;</code>
       * @return The kegId.
       */
      @java.lang.Override
      public int getKegId() {
        return kegId_;
      }
      /**
       * <pre>
       * The keg associated with this picture, if any.
       * </pre>
       *
       * <code>optional uint32 keg_id = 7;</code>
       * @param value The kegId to set.
       * @return This builder for chaining.
       */
      public Builder setKegId(int value) {
        bitField0_ |= 0x00000040;
        kegId_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The keg associated with this picture, if any.
       * </pre>
       *
       * <code>optional uint32 keg_id = 7;</code>
       * @return This builder for chaining.
       */
      public Builder clearKegId() {
        bitField0_ = (bitField0_ & ~0x00000040);
        kegId_ = 0;
        onChanged();
        return this;
      }

      private int sessionId_ ;
      /**
       * <pre>
       * The session associated with this picture, if any.
       * </pre>
       *
       * <code>optional uint32 session_id = 8;</code>
       * @return Whether the sessionId field is set.
       */
      @java.lang.Override
      public boolean hasSessionId() {
        return ((bitField0_ & 0x00000080) != 0);
      }
      /**
       * <pre>
       * The session associated with this picture, if any.
       * </pre>
       *
       * <code>optional uint32 session_id = 8;</code>
       * @return The sessionId.
       */
      @java.lang.Override
      public int getSessionId() {
        return sessionId_;
      }
      /**
       * <pre>
       * The session associated with this picture, if any.
       * </pre>
       *
       * <code>optional uint32 session_id = 8;</code>
       * @param value The sessionId to set.
       * @return This builder for chaining.
       */
      public Builder setSessionId(int value) {
        bitField0_ |= 0x00000080;
        sessionId_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The session associated with this picture, if any.
       * </pre>
       *
       * <code>optional uint32 session_id = 8;</code>
       * @return This builder for chaining.
       */
      public Builder clearSessionId() {
        bitField0_ = (bitField0_ & ~0x00000080);
        sessionId_ = 0;
        onChanged();
        return this;
      }

      private int drinkId_ ;
      /**
       * <pre>
       * The drink associated with this picture, if any.
       * </pre>
       *
       * <code>optional uint32 drink_id = 9;</code>
       * @return Whether the drinkId field is set.
       */
      @java.lang.Override
      public boolean hasDrinkId() {
        return ((bitField0_ & 0x00000100) != 0);
      }
      /**
       * <pre>
       * The drink associated with this picture, if any.
       * </pre>
       *
       * <code>optional uint32 drink_id = 9;</code>
       * @return The drinkId.
       */
      @java.lang.Override
      public int getDrinkId() {
        return drinkId_;
      }
      /**
       * <pre>
       * The drink associated with this picture, if any.
       * </pre>
       *
       * <code>optional uint32 drink_id = 9;</code>
       * @param value The drinkId to set.
       * @return This builder for chaining.
       */
      public Builder setDrinkId(int value) {
        bitField0_ |= 0x00000100;
        drinkId_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The drink associated with this picture, if any.
       * </pre>
       *
       * <code>optional uint32 drink_id = 9;</code>
       * @return This builder for chaining.
       */
      public Builder clearDrinkId() {
        bitField0_ = (bitField0_ & ~0x00000100);
        drinkId_ = 0;
        onChanged();
        return this;
      }

      private java.lang.Object thumbnailUrl_ = "";
      /**
       * <code>optional string thumbnail_url = 10;</code>
       * @return Whether the thumbnailUrl field is set.
       */
      public boolean hasThumbnailUrl() {
        return ((bitField0_ & 0x00000200) != 0);
      }
      /**
       * <code>optional string thumbnail_url = 10;</code>
       * @return The thumbnailUrl.
       */
      public java.lang.String getThumbnailUrl() {
        java.lang.Object ref = thumbnailUrl_;
        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()) {
            thumbnailUrl_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string thumbnail_url = 10;</code>
       * @return The bytes for thumbnailUrl.
       */
      public com.google.protobuf.ByteString
          getThumbnailUrlBytes() {
        java.lang.Object ref = thumbnailUrl_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          thumbnailUrl_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string thumbnail_url = 10;</code>
       * @param value The thumbnailUrl to set.
       * @return This builder for chaining.
       */
      public Builder setThumbnailUrl(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000200;
        thumbnailUrl_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string thumbnail_url = 10;</code>
       * @return This builder for chaining.
       */
      public Builder clearThumbnailUrl() {
        bitField0_ = (bitField0_ & ~0x00000200);
        thumbnailUrl_ = getDefaultInstance().getThumbnailUrl();
        onChanged();
        return this;
      }
      /**
       * <code>optional string thumbnail_url = 10;</code>
       * @param value The bytes for thumbnailUrl to set.
       * @return This builder for chaining.
       */
      public Builder setThumbnailUrlBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000200;
        thumbnailUrl_ = value;
        onChanged();
        return this;
      }

      private java.lang.Object originalUrl_ = "";
      /**
       * <code>optional string original_url = 11;</code>
       * @return Whether the originalUrl field is set.
       */
      public boolean hasOriginalUrl() {
        return ((bitField0_ & 0x00000400) != 0);
      }
      /**
       * <code>optional string original_url = 11;</code>
       * @return The originalUrl.
       */
      public java.lang.String getOriginalUrl() {
        java.lang.Object ref = originalUrl_;
        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()) {
            originalUrl_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string original_url = 11;</code>
       * @return The bytes for originalUrl.
       */
      public com.google.protobuf.ByteString
          getOriginalUrlBytes() {
        java.lang.Object ref = originalUrl_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          originalUrl_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string original_url = 11;</code>
       * @param value The originalUrl to set.
       * @return This builder for chaining.
       */
      public Builder setOriginalUrl(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000400;
        originalUrl_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string original_url = 11;</code>
       * @return This builder for chaining.
       */
      public Builder clearOriginalUrl() {
        bitField0_ = (bitField0_ & ~0x00000400);
        originalUrl_ = getDefaultInstance().getOriginalUrl();
        onChanged();
        return this;
      }
      /**
       * <code>optional string original_url = 11;</code>
       * @param value The bytes for originalUrl to set.
       * @return This builder for chaining.
       */
      public Builder setOriginalUrlBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000400;
        originalUrl_ = value;
        onChanged();
        return this;
      }

      private java.lang.Object smallResizedUrl_ = "";
      /**
       * <code>optional string small_resized_url = 13;</code>
       * @return Whether the smallResizedUrl field is set.
       */
      public boolean hasSmallResizedUrl() {
        return ((bitField0_ & 0x00000800) != 0);
      }
      /**
       * <code>optional string small_resized_url = 13;</code>
       * @return The smallResizedUrl.
       */
      public java.lang.String getSmallResizedUrl() {
        java.lang.Object ref = smallResizedUrl_;
        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()) {
            smallResizedUrl_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string small_resized_url = 13;</code>
       * @return The bytes for smallResizedUrl.
       */
      public com.google.protobuf.ByteString
          getSmallResizedUrlBytes() {
        java.lang.Object ref = smallResizedUrl_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          smallResizedUrl_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string small_resized_url = 13;</code>
       * @param value The smallResizedUrl to set.
       * @return This builder for chaining.
       */
      public Builder setSmallResizedUrl(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000800;
        smallResizedUrl_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string small_resized_url = 13;</code>
       * @return This builder for chaining.
       */
      public Builder clearSmallResizedUrl() {
        bitField0_ = (bitField0_ & ~0x00000800);
        smallResizedUrl_ = getDefaultInstance().getSmallResizedUrl();
        onChanged();
        return this;
      }
      /**
       * <code>optional string small_resized_url = 13;</code>
       * @param value The bytes for smallResizedUrl to set.
       * @return This builder for chaining.
       */
      public Builder setSmallResizedUrlBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000800;
        smallResizedUrl_ = 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:Image)
    }

    // @@protoc_insertion_point(class_scope:Image)
    private static final org.kegbot.proto.Models.Image DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new org.kegbot.proto.Models.Image();
    }

    public static org.kegbot.proto.Models.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 {
        Builder builder = newBuilder();
        try {
          builder.mergeFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          throw e.setUnfinishedMessage(builder.buildPartial());
        } catch (java.io.IOException e) {
          throw new com.google.protobuf.InvalidProtocolBufferException(
              e.getMessage()).setUnfinishedMessage(
                  builder.buildPartial());
        }
        return builder.buildPartial();
      }
    };

    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 org.kegbot.proto.Models.Image getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface KegOrBuilder extends
      // @@protoc_insertion_point(interface_extends:Keg)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <pre>
     * The unique identifier for this keg.
     * </pre>
     *
     * <code>required uint32 id = 1;</code>
     * @return Whether the id field is set.
     */
    boolean hasId();
    /**
     * <pre>
     * The unique identifier for this keg.
     * </pre>
     *
     * <code>required uint32 id = 1;</code>
     * @return The id.
     */
    int getId();

    /**
     * <pre>
     * Shell type.
     * </pre>
     *
     * <code>required string keg_type = 2;</code>
     * @return Whether the kegType field is set.
     */
    boolean hasKegType();
    /**
     * <pre>
     * Shell type.
     * </pre>
     *
     * <code>required string keg_type = 2;</code>
     * @return The kegType.
     */
    java.lang.String getKegType();
    /**
     * <pre>
     * Shell type.
     * </pre>
     *
     * <code>required string keg_type = 2;</code>
     * @return The bytes for kegType.
     */
    com.google.protobuf.ByteString
        getKegTypeBytes();

    /**
     * <pre>
     * Volume remaining in the keg, in milliliters.
     * </pre>
     *
     * <code>required double remaining_volume_ml = 3;</code>
     * @return Whether the remainingVolumeMl field is set.
     */
    boolean hasRemainingVolumeMl();
    /**
     * <pre>
     * Volume remaining in the keg, in milliliters.
     * </pre>
     *
     * <code>required double remaining_volume_ml = 3;</code>
     * @return The remainingVolumeMl.
     */
    double getRemainingVolumeMl();

    /**
     * <pre>
     * Initial volume.
     * </pre>
     *
     * <code>required double full_volume_ml = 4;</code>
     * @return Whether the fullVolumeMl field is set.
     */
    boolean hasFullVolumeMl();
    /**
     * <pre>
     * Initial volume.
     * </pre>
     *
     * <code>required double full_volume_ml = 4;</code>
     * @return The fullVolumeMl.
     */
    double getFullVolumeMl();

    /**
     * <pre>
     * Served volume.
     * </pre>
     *
     * <code>required double served_volume_ml = 5;</code>
     * @return Whether the servedVolumeMl field is set.
     */
    boolean hasServedVolumeMl();
    /**
     * <pre>
     * Served volume.
     * </pre>
     *
     * <code>required double served_volume_ml = 5;</code>
     * @return The servedVolumeMl.
     */
    double getServedVolumeMl();

    /**
     * <pre>
     * Total portion of the original volume that was spoiled, in milliliters.
     * Spilled volume is not attributed to any drink, but deducts from the keg
     * total.
     * </pre>
     *
     * <code>required double spilled_volume_ml = 6;</code>
     * @return Whether the spilledVolumeMl field is set.
     */
    boolean hasSpilledVolumeMl();
    /**
     * <pre>
     * Total portion of the original volume that was spoiled, in milliliters.
     * Spilled volume is not attributed to any drink, but deducts from the keg
     * total.
     * </pre>
     *
     * <code>required double spilled_volume_ml = 6;</code>
     * @return The spilledVolumeMl.
     */
    double getSpilledVolumeMl();

    /**
     * <pre>
     * Percentage of the keg that remains, as a value between 0 and 100.
     * </pre>
     *
     * <code>required double percent_full = 7;</code>
     * @return Whether the percentFull field is set.
     */
    boolean hasPercentFull();
    /**
     * <pre>
     * Percentage of the keg that remains, as a value between 0 and 100.
     * </pre>
     *
     * <code>required double percent_full = 7;</code>
     * @return The percentFull.
     */
    double getPercentFull();

    /**
     * <pre>
     * UTC time when the keg was started or tapped, as an ISO8061 UTC timestamp.
     * </pre>
     *
     * <code>optional string start_time = 8;</code>
     * @return Whether the startTime field is set.
     */
    boolean hasStartTime();
    /**
     * <pre>
     * UTC time when the keg was started or tapped, as an ISO8061 UTC timestamp.
     * </pre>
     *
     * <code>optional string start_time = 8;</code>
     * @return The startTime.
     */
    java.lang.String getStartTime();
    /**
     * <pre>
     * UTC time when the keg was started or tapped, as an ISO8061 UTC timestamp.
     * </pre>
     *
     * <code>optional string start_time = 8;</code>
     * @return The bytes for startTime.
     */
    com.google.protobuf.ByteString
        getStartTimeBytes();

    /**
     * <pre>
     * Local time when the keg was completed, as an ISO8061 UTC timestamp.  This
     * should be no sooner than the time of the most recent drink.  If the keg's
     * `status` is not 'offline', this value is undefined.
     * </pre>
     *
     * <code>optional string end_time = 9;</code>
     * @return Whether the endTime field is set.
     */
    boolean hasEndTime();
    /**
     * <pre>
     * Local time when the keg was completed, as an ISO8061 UTC timestamp.  This
     * should be no sooner than the time of the most recent drink.  If the keg's
     * `status` is not 'offline', this value is undefined.
     * </pre>
     *
     * <code>optional string end_time = 9;</code>
     * @return The endTime.
     */
    java.lang.String getEndTime();
    /**
     * <pre>
     * Local time when the keg was completed, as an ISO8061 UTC timestamp.  This
     * should be no sooner than the time of the most recent drink.  If the keg's
     * `status` is not 'offline', this value is undefined.
     * </pre>
     *
     * <code>optional string end_time = 9;</code>
     * @return The bytes for endTime.
     */
    com.google.protobuf.ByteString
        getEndTimeBytes();

    /**
     * <pre>
     * True if the Keg is currently online.
     * </pre>
     *
     * <code>optional bool online = 10;</code>
     * @return Whether the online field is set.
     */
    boolean hasOnline();
    /**
     * <pre>
     * True if the Keg is currently online.
     * </pre>
     *
     * <code>optional bool online = 10;</code>
     * @return The online.
     */
    boolean getOnline();

    /**
     * <pre>
     * The adminstrator's description of this keg.
     * </pre>
     *
     * <code>optional string description = 11;</code>
     * @return Whether the description field is set.
     */
    boolean hasDescription();
    /**
     * <pre>
     * The adminstrator's description of this keg.
     * </pre>
     *
     * <code>optional string description = 11;</code>
     * @return The description.
     */
    java.lang.String getDescription();
    /**
     * <pre>
     * The adminstrator's description of this keg.
     * </pre>
     *
     * <code>optional string description = 11;</code>
     * @return The bytes for description.
     */
    com.google.protobuf.ByteString
        getDescriptionBytes();

    /**
     * <pre>
     * Beverage type.
     * </pre>
     *
     * <code>optional .Beverage beverage = 12;</code>
     * @return Whether the beverage field is set.
     */
    boolean hasBeverage();
    /**
     * <pre>
     * Beverage type.
     * </pre>
     *
     * <code>optional .Beverage beverage = 12;</code>
     * @return The beverage.
     */
    org.kegbot.proto.Models.Beverage getBeverage();
    /**
     * <pre>
     * Beverage type.
     * </pre>
     *
     * <code>optional .Beverage beverage = 12;</code>
     */
    org.kegbot.proto.Models.BeverageOrBuilder getBeverageOrBuilder();

    /**
     * <code>optional string illustration_url = 21;</code>
     * @return Whether the illustrationUrl field is set.
     */
    boolean hasIllustrationUrl();
    /**
     * <code>optional string illustration_url = 21;</code>
     * @return The illustrationUrl.
     */
    java.lang.String getIllustrationUrl();
    /**
     * <code>optional string illustration_url = 21;</code>
     * @return The bytes for illustrationUrl.
     */
    com.google.protobuf.ByteString
        getIllustrationUrlBytes();

    /**
     * <code>optional string illustration_thumbnail_url = 22;</code>
     * @return Whether the illustrationThumbnailUrl field is set.
     */
    boolean hasIllustrationThumbnailUrl();
    /**
     * <code>optional string illustration_thumbnail_url = 22;</code>
     * @return The illustrationThumbnailUrl.
     */
    java.lang.String getIllustrationThumbnailUrl();
    /**
     * <code>optional string illustration_thumbnail_url = 22;</code>
     * @return The bytes for illustrationThumbnailUrl.
     */
    com.google.protobuf.ByteString
        getIllustrationThumbnailUrlBytes();

    /**
     * <code>optional .BeerType type = 13 [deprecated = true];</code>
     * @deprecated
     * @return Whether the type field is set.
     */
    @java.lang.Deprecated boolean hasType();
    /**
     * <code>optional .BeerType type = 13 [deprecated = true];</code>
     * @deprecated
     * @return The type.
     */
    @java.lang.Deprecated org.kegbot.proto.Models.BeerType getType();
    /**
     * <code>optional .BeerType type = 13 [deprecated = true];</code>
     */
    @java.lang.Deprecated org.kegbot.proto.Models.BeerTypeOrBuilder getTypeOrBuilder();

    /**
     * <code>optional string type_id = 14 [deprecated = true];</code>
     * @deprecated
     * @return Whether the typeId field is set.
     */
    @java.lang.Deprecated boolean hasTypeId();
    /**
     * <code>optional string type_id = 14 [deprecated = true];</code>
     * @deprecated
     * @return The typeId.
     */
    @java.lang.Deprecated java.lang.String getTypeId();
    /**
     * <code>optional string type_id = 14 [deprecated = true];</code>
     * @deprecated
     * @return The bytes for typeId.
     */
    @java.lang.Deprecated com.google.protobuf.ByteString
        getTypeIdBytes();

    /**
     * <code>optional uint32 size_id = 15 [deprecated = true];</code>
     * @deprecated
     * @return Whether the sizeId field is set.
     */
    @java.lang.Deprecated boolean hasSizeId();
    /**
     * <code>optional uint32 size_id = 15 [deprecated = true];</code>
     * @deprecated
     * @return The sizeId.
     */
    @java.lang.Deprecated int getSizeId();

    /**
     * <code>optional .KegSize size = 16 [deprecated = true];</code>
     * @deprecated
     * @return Whether the size field is set.
     */
    @java.lang.Deprecated boolean hasSize();
    /**
     * <code>optional .KegSize size = 16 [deprecated = true];</code>
     * @deprecated
     * @return The size.
     */
    @java.lang.Deprecated org.kegbot.proto.Models.KegSize getSize();
    /**
     * <code>optional .KegSize size = 16 [deprecated = true];</code>
     */
    @java.lang.Deprecated org.kegbot.proto.Models.KegSizeOrBuilder getSizeOrBuilder();

    /**
     * <code>optional string size_name = 17 [deprecated = true];</code>
     * @deprecated
     * @return Whether the sizeName field is set.
     */
    @java.lang.Deprecated boolean hasSizeName();
    /**
     * <code>optional string size_name = 17 [deprecated = true];</code>
     * @deprecated
     * @return The sizeName.
     */
    @java.lang.Deprecated java.lang.String getSizeName();
    /**
     * <code>optional string size_name = 17 [deprecated = true];</code>
     * @deprecated
     * @return The bytes for sizeName.
     */
    @java.lang.Deprecated com.google.protobuf.ByteString
        getSizeNameBytes();

    /**
     * <code>optional double size_volume_ml = 18 [deprecated = true];</code>
     * @deprecated
     * @return Whether the sizeVolumeMl field is set.
     */
    @java.lang.Deprecated boolean hasSizeVolumeMl();
    /**
     * <code>optional double size_volume_ml = 18 [deprecated = true];</code>
     * @deprecated
     * @return The sizeVolumeMl.
     */
    @java.lang.Deprecated double getSizeVolumeMl();

    /**
     * <code>optional double volume_ml_remain = 19 [deprecated = true];</code>
     * @deprecated
     * @return Whether the volumeMlRemain field is set.
     */
    @java.lang.Deprecated boolean hasVolumeMlRemain();
    /**
     * <code>optional double volume_ml_remain = 19 [deprecated = true];</code>
     * @deprecated
     * @return The volumeMlRemain.
     */
    @java.lang.Deprecated double getVolumeMlRemain();

    /**
     * <code>optional double spilled_ml = 20 [deprecated = true];</code>
     * @deprecated
     * @return Whether the spilledMl field is set.
     */
    @java.lang.Deprecated boolean hasSpilledMl();
    /**
     * <code>optional double spilled_ml = 20 [deprecated = true];</code>
     * @deprecated
     * @return The spilledMl.
     */
    @java.lang.Deprecated double getSpilledMl();
  }
  /**
   * <pre>
   * A single instance of a Keg that was attached to the Kegbot.
   * </pre>
   *
   * Protobuf type {@code Keg}
   */
  public static final class Keg extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:Keg)
      KegOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use Keg.newBuilder() to construct.
    private Keg(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private Keg() {
      kegType_ = "";
      startTime_ = "";
      endTime_ = "";
      description_ = "";
      illustrationUrl_ = "";
      illustrationThumbnailUrl_ = "";
      typeId_ = "";
      sizeName_ = "";
    }

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

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return org.kegbot.proto.Models.internal_static_Keg_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return org.kegbot.proto.Models.internal_static_Keg_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              org.kegbot.proto.Models.Keg.class, org.kegbot.proto.Models.Keg.Builder.class);
    }

    private int bitField0_;
    public static final int ID_FIELD_NUMBER = 1;
    private int id_;
    /**
     * <pre>
     * The unique identifier for this keg.
     * </pre>
     *
     * <code>required uint32 id = 1;</code>
     * @return Whether the id field is set.
     */
    @java.lang.Override
    public boolean hasId() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <pre>
     * The unique identifier for this keg.
     * </pre>
     *
     * <code>required uint32 id = 1;</code>
     * @return The id.
     */
    @java.lang.Override
    public int getId() {
      return id_;
    }

    public static final int KEG_TYPE_FIELD_NUMBER = 2;
    private volatile java.lang.Object kegType_;
    /**
     * <pre>
     * Shell type.
     * </pre>
     *
     * <code>required string keg_type = 2;</code>
     * @return Whether the kegType field is set.
     */
    @java.lang.Override
    public boolean hasKegType() {
      return ((bitField0_ & 0x00000002) != 0);
    }
    /**
     * <pre>
     * Shell type.
     * </pre>
     *
     * <code>required string keg_type = 2;</code>
     * @return The kegType.
     */
    @java.lang.Override
    public java.lang.String getKegType() {
      java.lang.Object ref = kegType_;
      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()) {
          kegType_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * Shell type.
     * </pre>
     *
     * <code>required string keg_type = 2;</code>
     * @return The bytes for kegType.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getKegTypeBytes() {
      java.lang.Object ref = kegType_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        kegType_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int REMAINING_VOLUME_ML_FIELD_NUMBER = 3;
    private double remainingVolumeMl_;
    /**
     * <pre>
     * Volume remaining in the keg, in milliliters.
     * </pre>
     *
     * <code>required double remaining_volume_ml = 3;</code>
     * @return Whether the remainingVolumeMl field is set.
     */
    @java.lang.Override
    public boolean hasRemainingVolumeMl() {
      return ((bitField0_ & 0x00000004) != 0);
    }
    /**
     * <pre>
     * Volume remaining in the keg, in milliliters.
     * </pre>
     *
     * <code>required double remaining_volume_ml = 3;</code>
     * @return The remainingVolumeMl.
     */
    @java.lang.Override
    public double getRemainingVolumeMl() {
      return remainingVolumeMl_;
    }

    public static final int FULL_VOLUME_ML_FIELD_NUMBER = 4;
    private double fullVolumeMl_;
    /**
     * <pre>
     * Initial volume.
     * </pre>
     *
     * <code>required double full_volume_ml = 4;</code>
     * @return Whether the fullVolumeMl field is set.
     */
    @java.lang.Override
    public boolean hasFullVolumeMl() {
      return ((bitField0_ & 0x00000008) != 0);
    }
    /**
     * <pre>
     * Initial volume.
     * </pre>
     *
     * <code>required double full_volume_ml = 4;</code>
     * @return The fullVolumeMl.
     */
    @java.lang.Override
    public double getFullVolumeMl() {
      return fullVolumeMl_;
    }

    public static final int SERVED_VOLUME_ML_FIELD_NUMBER = 5;
    private double servedVolumeMl_;
    /**
     * <pre>
     * Served volume.
     * </pre>
     *
     * <code>required double served_volume_ml = 5;</code>
     * @return Whether the servedVolumeMl field is set.
     */
    @java.lang.Override
    public boolean hasServedVolumeMl() {
      return ((bitField0_ & 0x00000010) != 0);
    }
    /**
     * <pre>
     * Served volume.
     * </pre>
     *
     * <code>required double served_volume_ml = 5;</code>
     * @return The servedVolumeMl.
     */
    @java.lang.Override
    public double getServedVolumeMl() {
      return servedVolumeMl_;
    }

    public static final int SPILLED_VOLUME_ML_FIELD_NUMBER = 6;
    private double spilledVolumeMl_;
    /**
     * <pre>
     * Total portion of the original volume that was spoiled, in milliliters.
     * Spilled volume is not attributed to any drink, but deducts from the keg
     * total.
     * </pre>
     *
     * <code>required double spilled_volume_ml = 6;</code>
     * @return Whether the spilledVolumeMl field is set.
     */
    @java.lang.Override
    public boolean hasSpilledVolumeMl() {
      return ((bitField0_ & 0x00000020) != 0);
    }
    /**
     * <pre>
     * Total portion of the original volume that was spoiled, in milliliters.
     * Spilled volume is not attributed to any drink, but deducts from the keg
     * total.
     * </pre>
     *
     * <code>required double spilled_volume_ml = 6;</code>
     * @return The spilledVolumeMl.
     */
    @java.lang.Override
    public double getSpilledVolumeMl() {
      return spilledVolumeMl_;
    }

    public static final int PERCENT_FULL_FIELD_NUMBER = 7;
    private double percentFull_;
    /**
     * <pre>
     * Percentage of the keg that remains, as a value between 0 and 100.
     * </pre>
     *
     * <code>required double percent_full = 7;</code>
     * @return Whether the percentFull field is set.
     */
    @java.lang.Override
    public boolean hasPercentFull() {
      return ((bitField0_ & 0x00000040) != 0);
    }
    /**
     * <pre>
     * Percentage of the keg that remains, as a value between 0 and 100.
     * </pre>
     *
     * <code>required double percent_full = 7;</code>
     * @return The percentFull.
     */
    @java.lang.Override
    public double getPercentFull() {
      return percentFull_;
    }

    public static final int START_TIME_FIELD_NUMBER = 8;
    private volatile java.lang.Object startTime_;
    /**
     * <pre>
     * UTC time when the keg was started or tapped, as an ISO8061 UTC timestamp.
     * </pre>
     *
     * <code>optional string start_time = 8;</code>
     * @return Whether the startTime field is set.
     */
    @java.lang.Override
    public boolean hasStartTime() {
      return ((bitField0_ & 0x00000080) != 0);
    }
    /**
     * <pre>
     * UTC time when the keg was started or tapped, as an ISO8061 UTC timestamp.
     * </pre>
     *
     * <code>optional string start_time = 8;</code>
     * @return The startTime.
     */
    @java.lang.Override
    public java.lang.String getStartTime() {
      java.lang.Object ref = startTime_;
      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()) {
          startTime_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * UTC time when the keg was started or tapped, as an ISO8061 UTC timestamp.
     * </pre>
     *
     * <code>optional string start_time = 8;</code>
     * @return The bytes for startTime.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getStartTimeBytes() {
      java.lang.Object ref = startTime_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        startTime_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int END_TIME_FIELD_NUMBER = 9;
    private volatile java.lang.Object endTime_;
    /**
     * <pre>
     * Local time when the keg was completed, as an ISO8061 UTC timestamp.  This
     * should be no sooner than the time of the most recent drink.  If the keg's
     * `status` is not 'offline', this value is undefined.
     * </pre>
     *
     * <code>optional string end_time = 9;</code>
     * @return Whether the endTime field is set.
     */
    @java.lang.Override
    public boolean hasEndTime() {
      return ((bitField0_ & 0x00000100) != 0);
    }
    /**
     * <pre>
     * Local time when the keg was completed, as an ISO8061 UTC timestamp.  This
     * should be no sooner than the time of the most recent drink.  If the keg's
     * `status` is not 'offline', this value is undefined.
     * </pre>
     *
     * <code>optional string end_time = 9;</code>
     * @return The endTime.
     */
    @java.lang.Override
    public java.lang.String getEndTime() {
      java.lang.Object ref = endTime_;
      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()) {
          endTime_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * Local time when the keg was completed, as an ISO8061 UTC timestamp.  This
     * should be no sooner than the time of the most recent drink.  If the keg's
     * `status` is not 'offline', this value is undefined.
     * </pre>
     *
     * <code>optional string end_time = 9;</code>
     * @return The bytes for endTime.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getEndTimeBytes() {
      java.lang.Object ref = endTime_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        endTime_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int ONLINE_FIELD_NUMBER = 10;
    private boolean online_;
    /**
     * <pre>
     * True if the Keg is currently online.
     * </pre>
     *
     * <code>optional bool online = 10;</code>
     * @return Whether the online field is set.
     */
    @java.lang.Override
    public boolean hasOnline() {
      return ((bitField0_ & 0x00000200) != 0);
    }
    /**
     * <pre>
     * True if the Keg is currently online.
     * </pre>
     *
     * <code>optional bool online = 10;</code>
     * @return The online.
     */
    @java.lang.Override
    public boolean getOnline() {
      return online_;
    }

    public static final int DESCRIPTION_FIELD_NUMBER = 11;
    private volatile java.lang.Object description_;
    /**
     * <pre>
     * The adminstrator's description of this keg.
     * </pre>
     *
     * <code>optional string description = 11;</code>
     * @return Whether the description field is set.
     */
    @java.lang.Override
    public boolean hasDescription() {
      return ((bitField0_ & 0x00000400) != 0);
    }
    /**
     * <pre>
     * The adminstrator's description of this keg.
     * </pre>
     *
     * <code>optional string description = 11;</code>
     * @return The description.
     */
    @java.lang.Override
    public java.lang.String getDescription() {
      java.lang.Object ref = description_;
      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()) {
          description_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * The adminstrator's description of this keg.
     * </pre>
     *
     * <code>optional string description = 11;</code>
     * @return The bytes for description.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getDescriptionBytes() {
      java.lang.Object ref = description_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        description_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int BEVERAGE_FIELD_NUMBER = 12;
    private org.kegbot.proto.Models.Beverage beverage_;
    /**
     * <pre>
     * Beverage type.
     * </pre>
     *
     * <code>optional .Beverage beverage = 12;</code>
     * @return Whether the beverage field is set.
     */
    @java.lang.Override
    public boolean hasBeverage() {
      return ((bitField0_ & 0x00000800) != 0);
    }
    /**
     * <pre>
     * Beverage type.
     * </pre>
     *
     * <code>optional .Beverage beverage = 12;</code>
     * @return The beverage.
     */
    @java.lang.Override
    public org.kegbot.proto.Models.Beverage getBeverage() {
      return beverage_ == null ? org.kegbot.proto.Models.Beverage.getDefaultInstance() : beverage_;
    }
    /**
     * <pre>
     * Beverage type.
     * </pre>
     *
     * <code>optional .Beverage beverage = 12;</code>
     */
    @java.lang.Override
    public org.kegbot.proto.Models.BeverageOrBuilder getBeverageOrBuilder() {
      return beverage_ == null ? org.kegbot.proto.Models.Beverage.getDefaultInstance() : beverage_;
    }

    public static final int ILLUSTRATION_URL_FIELD_NUMBER = 21;
    private volatile java.lang.Object illustrationUrl_;
    /**
     * <code>optional string illustration_url = 21;</code>
     * @return Whether the illustrationUrl field is set.
     */
    @java.lang.Override
    public boolean hasIllustrationUrl() {
      return ((bitField0_ & 0x00001000) != 0);
    }
    /**
     * <code>optional string illustration_url = 21;</code>
     * @return The illustrationUrl.
     */
    @java.lang.Override
    public java.lang.String getIllustrationUrl() {
      java.lang.Object ref = illustrationUrl_;
      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()) {
          illustrationUrl_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string illustration_url = 21;</code>
     * @return The bytes for illustrationUrl.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getIllustrationUrlBytes() {
      java.lang.Object ref = illustrationUrl_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        illustrationUrl_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int ILLUSTRATION_THUMBNAIL_URL_FIELD_NUMBER = 22;
    private volatile java.lang.Object illustrationThumbnailUrl_;
    /**
     * <code>optional string illustration_thumbnail_url = 22;</code>
     * @return Whether the illustrationThumbnailUrl field is set.
     */
    @java.lang.Override
    public boolean hasIllustrationThumbnailUrl() {
      return ((bitField0_ & 0x00002000) != 0);
    }
    /**
     * <code>optional string illustration_thumbnail_url = 22;</code>
     * @return The illustrationThumbnailUrl.
     */
    @java.lang.Override
    public java.lang.String getIllustrationThumbnailUrl() {
      java.lang.Object ref = illustrationThumbnailUrl_;
      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()) {
          illustrationThumbnailUrl_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string illustration_thumbnail_url = 22;</code>
     * @return The bytes for illustrationThumbnailUrl.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getIllustrationThumbnailUrlBytes() {
      java.lang.Object ref = illustrationThumbnailUrl_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        illustrationThumbnailUrl_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int TYPE_FIELD_NUMBER = 13;
    private org.kegbot.proto.Models.BeerType type_;
    /**
     * <code>optional .BeerType type = 13 [deprecated = true];</code>
     * @deprecated
     * @return Whether the type field is set.
     */
    @java.lang.Override
    @java.lang.Deprecated public boolean hasType() {
      return ((bitField0_ & 0x00004000) != 0);
    }
    /**
     * <code>optional .BeerType type = 13 [deprecated = true];</code>
     * @deprecated
     * @return The type.
     */
    @java.lang.Override
    @java.lang.Deprecated public org.kegbot.proto.Models.BeerType getType() {
      return type_ == null ? org.kegbot.proto.Models.BeerType.getDefaultInstance() : type_;
    }
    /**
     * <code>optional .BeerType type = 13 [deprecated = true];</code>
     */
    @java.lang.Override
    @java.lang.Deprecated public org.kegbot.proto.Models.BeerTypeOrBuilder getTypeOrBuilder() {
      return type_ == null ? org.kegbot.proto.Models.BeerType.getDefaultInstance() : type_;
    }

    public static final int TYPE_ID_FIELD_NUMBER = 14;
    private volatile java.lang.Object typeId_;
    /**
     * <code>optional string type_id = 14 [deprecated = true];</code>
     * @deprecated
     * @return Whether the typeId field is set.
     */
    @java.lang.Override
    @java.lang.Deprecated public boolean hasTypeId() {
      return ((bitField0_ & 0x00008000) != 0);
    }
    /**
     * <code>optional string type_id = 14 [deprecated = true];</code>
     * @deprecated
     * @return The typeId.
     */
    @java.lang.Override
    @java.lang.Deprecated public java.lang.String getTypeId() {
      java.lang.Object ref = typeId_;
      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()) {
          typeId_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string type_id = 14 [deprecated = true];</code>
     * @deprecated
     * @return The bytes for typeId.
     */
    @java.lang.Override
    @java.lang.Deprecated public com.google.protobuf.ByteString
        getTypeIdBytes() {
      java.lang.Object ref = typeId_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        typeId_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int SIZE_ID_FIELD_NUMBER = 15;
    private int sizeId_;
    /**
     * <code>optional uint32 size_id = 15 [deprecated = true];</code>
     * @deprecated
     * @return Whether the sizeId field is set.
     */
    @java.lang.Override
    @java.lang.Deprecated public boolean hasSizeId() {
      return ((bitField0_ & 0x00010000) != 0);
    }
    /**
     * <code>optional uint32 size_id = 15 [deprecated = true];</code>
     * @deprecated
     * @return The sizeId.
     */
    @java.lang.Override
    @java.lang.Deprecated public int getSizeId() {
      return sizeId_;
    }

    public static final int SIZE_FIELD_NUMBER = 16;
    private org.kegbot.proto.Models.KegSize size_;
    /**
     * <code>optional .KegSize size = 16 [deprecated = true];</code>
     * @deprecated
     * @return Whether the size field is set.
     */
    @java.lang.Override
    @java.lang.Deprecated public boolean hasSize() {
      return ((bitField0_ & 0x00020000) != 0);
    }
    /**
     * <code>optional .KegSize size = 16 [deprecated = true];</code>
     * @deprecated
     * @return The size.
     */
    @java.lang.Override
    @java.lang.Deprecated public org.kegbot.proto.Models.KegSize getSize() {
      return size_ == null ? org.kegbot.proto.Models.KegSize.getDefaultInstance() : size_;
    }
    /**
     * <code>optional .KegSize size = 16 [deprecated = true];</code>
     */
    @java.lang.Override
    @java.lang.Deprecated public org.kegbot.proto.Models.KegSizeOrBuilder getSizeOrBuilder() {
      return size_ == null ? org.kegbot.proto.Models.KegSize.getDefaultInstance() : size_;
    }

    public static final int SIZE_NAME_FIELD_NUMBER = 17;
    private volatile java.lang.Object sizeName_;
    /**
     * <code>optional string size_name = 17 [deprecated = true];</code>
     * @deprecated
     * @return Whether the sizeName field is set.
     */
    @java.lang.Override
    @java.lang.Deprecated public boolean hasSizeName() {
      return ((bitField0_ & 0x00040000) != 0);
    }
    /**
     * <code>optional string size_name = 17 [deprecated = true];</code>
     * @deprecated
     * @return The sizeName.
     */
    @java.lang.Override
    @java.lang.Deprecated public java.lang.String getSizeName() {
      java.lang.Object ref = sizeName_;
      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()) {
          sizeName_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string size_name = 17 [deprecated = true];</code>
     * @deprecated
     * @return The bytes for sizeName.
     */
    @java.lang.Override
    @java.lang.Deprecated public com.google.protobuf.ByteString
        getSizeNameBytes() {
      java.lang.Object ref = sizeName_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        sizeName_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int SIZE_VOLUME_ML_FIELD_NUMBER = 18;
    private double sizeVolumeMl_;
    /**
     * <code>optional double size_volume_ml = 18 [deprecated = true];</code>
     * @deprecated
     * @return Whether the sizeVolumeMl field is set.
     */
    @java.lang.Override
    @java.lang.Deprecated public boolean hasSizeVolumeMl() {
      return ((bitField0_ & 0x00080000) != 0);
    }
    /**
     * <code>optional double size_volume_ml = 18 [deprecated = true];</code>
     * @deprecated
     * @return The sizeVolumeMl.
     */
    @java.lang.Override
    @java.lang.Deprecated public double getSizeVolumeMl() {
      return sizeVolumeMl_;
    }

    public static final int VOLUME_ML_REMAIN_FIELD_NUMBER = 19;
    private double volumeMlRemain_;
    /**
     * <code>optional double volume_ml_remain = 19 [deprecated = true];</code>
     * @deprecated
     * @return Whether the volumeMlRemain field is set.
     */
    @java.lang.Override
    @java.lang.Deprecated public boolean hasVolumeMlRemain() {
      return ((bitField0_ & 0x00100000) != 0);
    }
    /**
     * <code>optional double volume_ml_remain = 19 [deprecated = true];</code>
     * @deprecated
     * @return The volumeMlRemain.
     */
    @java.lang.Override
    @java.lang.Deprecated public double getVolumeMlRemain() {
      return volumeMlRemain_;
    }

    public static final int SPILLED_ML_FIELD_NUMBER = 20;
    private double spilledMl_;
    /**
     * <code>optional double spilled_ml = 20 [deprecated = true];</code>
     * @deprecated
     * @return Whether the spilledMl field is set.
     */
    @java.lang.Override
    @java.lang.Deprecated public boolean hasSpilledMl() {
      return ((bitField0_ & 0x00200000) != 0);
    }
    /**
     * <code>optional double spilled_ml = 20 [deprecated = true];</code>
     * @deprecated
     * @return The spilledMl.
     */
    @java.lang.Override
    @java.lang.Deprecated public double getSpilledMl() {
      return spilledMl_;
    }

    public static org.kegbot.proto.Models.Keg parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.Keg parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.Keg parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.Keg parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.Keg parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.Keg parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.Keg parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.Keg 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 org.kegbot.proto.Models.Keg parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.Keg 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 org.kegbot.proto.Models.Keg parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.Keg 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(org.kegbot.proto.Models.Keg 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 single instance of a Keg that was attached to the Kegbot.
     * </pre>
     *
     * Protobuf type {@code Keg}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:Keg)
        org.kegbot.proto.Models.KegOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return org.kegbot.proto.Models.internal_static_Keg_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return org.kegbot.proto.Models.internal_static_Keg_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                org.kegbot.proto.Models.Keg.class, org.kegbot.proto.Models.Keg.Builder.class);
      }

      // Construct using org.kegbot.proto.Models.Keg.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
          getBeverageFieldBuilder();
          getTypeFieldBuilder();
          getSizeFieldBuilder();
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        id_ = 0;
        bitField0_ = (bitField0_ & ~0x00000001);
        kegType_ = "";
        bitField0_ = (bitField0_ & ~0x00000002);
        remainingVolumeMl_ = 0D;
        bitField0_ = (bitField0_ & ~0x00000004);
        fullVolumeMl_ = 0D;
        bitField0_ = (bitField0_ & ~0x00000008);
        servedVolumeMl_ = 0D;
        bitField0_ = (bitField0_ & ~0x00000010);
        spilledVolumeMl_ = 0D;
        bitField0_ = (bitField0_ & ~0x00000020);
        percentFull_ = 0D;
        bitField0_ = (bitField0_ & ~0x00000040);
        startTime_ = "";
        bitField0_ = (bitField0_ & ~0x00000080);
        endTime_ = "";
        bitField0_ = (bitField0_ & ~0x00000100);
        online_ = false;
        bitField0_ = (bitField0_ & ~0x00000200);
        description_ = "";
        bitField0_ = (bitField0_ & ~0x00000400);
        if (beverageBuilder_ == null) {
          beverage_ = null;
        } else {
          beverageBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000800);
        illustrationUrl_ = "";
        bitField0_ = (bitField0_ & ~0x00001000);
        illustrationThumbnailUrl_ = "";
        bitField0_ = (bitField0_ & ~0x00002000);
        if (typeBuilder_ == null) {
          type_ = null;
        } else {
          typeBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00004000);
        typeId_ = "";
        bitField0_ = (bitField0_ & ~0x00008000);
        sizeId_ = 0;
        bitField0_ = (bitField0_ & ~0x00010000);
        if (sizeBuilder_ == null) {
          size_ = null;
        } else {
          sizeBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00020000);
        sizeName_ = "";
        bitField0_ = (bitField0_ & ~0x00040000);
        sizeVolumeMl_ = 0D;
        bitField0_ = (bitField0_ & ~0x00080000);
        volumeMlRemain_ = 0D;
        bitField0_ = (bitField0_ & ~0x00100000);
        spilledMl_ = 0D;
        bitField0_ = (bitField0_ & ~0x00200000);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return org.kegbot.proto.Models.internal_static_Keg_descriptor;
      }

      @java.lang.Override
      public org.kegbot.proto.Models.Keg getDefaultInstanceForType() {
        return org.kegbot.proto.Models.Keg.getDefaultInstance();
      }

      @java.lang.Override
      public org.kegbot.proto.Models.Keg build() {
        org.kegbot.proto.Models.Keg result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public org.kegbot.proto.Models.Keg buildPartial() {
        org.kegbot.proto.Models.Keg result = new org.kegbot.proto.Models.Keg(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)) {
          to_bitField0_ |= 0x00000002;
        }
        result.kegType_ = kegType_;
        if (((from_bitField0_ & 0x00000004) != 0)) {
          result.remainingVolumeMl_ = remainingVolumeMl_;
          to_bitField0_ |= 0x00000004;
        }
        if (((from_bitField0_ & 0x00000008) != 0)) {
          result.fullVolumeMl_ = fullVolumeMl_;
          to_bitField0_ |= 0x00000008;
        }
        if (((from_bitField0_ & 0x00000010) != 0)) {
          result.servedVolumeMl_ = servedVolumeMl_;
          to_bitField0_ |= 0x00000010;
        }
        if (((from_bitField0_ & 0x00000020) != 0)) {
          result.spilledVolumeMl_ = spilledVolumeMl_;
          to_bitField0_ |= 0x00000020;
        }
        if (((from_bitField0_ & 0x00000040) != 0)) {
          result.percentFull_ = percentFull_;
          to_bitField0_ |= 0x00000040;
        }
        if (((from_bitField0_ & 0x00000080) != 0)) {
          to_bitField0_ |= 0x00000080;
        }
        result.startTime_ = startTime_;
        if (((from_bitField0_ & 0x00000100) != 0)) {
          to_bitField0_ |= 0x00000100;
        }
        result.endTime_ = endTime_;
        if (((from_bitField0_ & 0x00000200) != 0)) {
          result.online_ = online_;
          to_bitField0_ |= 0x00000200;
        }
        if (((from_bitField0_ & 0x00000400) != 0)) {
          to_bitField0_ |= 0x00000400;
        }
        result.description_ = description_;
        if (((from_bitField0_ & 0x00000800) != 0)) {
          if (beverageBuilder_ == null) {
            result.beverage_ = beverage_;
          } else {
            result.beverage_ = beverageBuilder_.build();
          }
          to_bitField0_ |= 0x00000800;
        }
        if (((from_bitField0_ & 0x00001000) != 0)) {
          to_bitField0_ |= 0x00001000;
        }
        result.illustrationUrl_ = illustrationUrl_;
        if (((from_bitField0_ & 0x00002000) != 0)) {
          to_bitField0_ |= 0x00002000;
        }
        result.illustrationThumbnailUrl_ = illustrationThumbnailUrl_;
        if (((from_bitField0_ & 0x00004000) != 0)) {
          if (typeBuilder_ == null) {
            result.type_ = type_;
          } else {
            result.type_ = typeBuilder_.build();
          }
          to_bitField0_ |= 0x00004000;
        }
        if (((from_bitField0_ & 0x00008000) != 0)) {
          to_bitField0_ |= 0x00008000;
        }
        result.typeId_ = typeId_;
        if (((from_bitField0_ & 0x00010000) != 0)) {
          result.sizeId_ = sizeId_;
          to_bitField0_ |= 0x00010000;
        }
        if (((from_bitField0_ & 0x00020000) != 0)) {
          if (sizeBuilder_ == null) {
            result.size_ = size_;
          } else {
            result.size_ = sizeBuilder_.build();
          }
          to_bitField0_ |= 0x00020000;
        }
        if (((from_bitField0_ & 0x00040000) != 0)) {
          to_bitField0_ |= 0x00040000;
        }
        result.sizeName_ = sizeName_;
        if (((from_bitField0_ & 0x00080000) != 0)) {
          result.sizeVolumeMl_ = sizeVolumeMl_;
          to_bitField0_ |= 0x00080000;
        }
        if (((from_bitField0_ & 0x00100000) != 0)) {
          result.volumeMlRemain_ = volumeMlRemain_;
          to_bitField0_ |= 0x00100000;
        }
        if (((from_bitField0_ & 0x00200000) != 0)) {
          result.spilledMl_ = spilledMl_;
          to_bitField0_ |= 0x00200000;
        }
        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);
      }
      private int bitField0_;

      private int id_ ;
      /**
       * <pre>
       * The unique identifier for this keg.
       * </pre>
       *
       * <code>required uint32 id = 1;</code>
       * @return Whether the id field is set.
       */
      @java.lang.Override
      public boolean hasId() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <pre>
       * The unique identifier for this keg.
       * </pre>
       *
       * <code>required uint32 id = 1;</code>
       * @return The id.
       */
      @java.lang.Override
      public int getId() {
        return id_;
      }
      /**
       * <pre>
       * The unique identifier for this keg.
       * </pre>
       *
       * <code>required uint32 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>
       * The unique identifier for this keg.
       * </pre>
       *
       * <code>required uint32 id = 1;</code>
       * @return This builder for chaining.
       */
      public Builder clearId() {
        bitField0_ = (bitField0_ & ~0x00000001);
        id_ = 0;
        onChanged();
        return this;
      }

      private java.lang.Object kegType_ = "";
      /**
       * <pre>
       * Shell type.
       * </pre>
       *
       * <code>required string keg_type = 2;</code>
       * @return Whether the kegType field is set.
       */
      public boolean hasKegType() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <pre>
       * Shell type.
       * </pre>
       *
       * <code>required string keg_type = 2;</code>
       * @return The kegType.
       */
      public java.lang.String getKegType() {
        java.lang.Object ref = kegType_;
        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()) {
            kegType_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * Shell type.
       * </pre>
       *
       * <code>required string keg_type = 2;</code>
       * @return The bytes for kegType.
       */
      public com.google.protobuf.ByteString
          getKegTypeBytes() {
        java.lang.Object ref = kegType_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          kegType_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * Shell type.
       * </pre>
       *
       * <code>required string keg_type = 2;</code>
       * @param value The kegType to set.
       * @return This builder for chaining.
       */
      public Builder setKegType(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
        kegType_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Shell type.
       * </pre>
       *
       * <code>required string keg_type = 2;</code>
       * @return This builder for chaining.
       */
      public Builder clearKegType() {
        bitField0_ = (bitField0_ & ~0x00000002);
        kegType_ = getDefaultInstance().getKegType();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Shell type.
       * </pre>
       *
       * <code>required string keg_type = 2;</code>
       * @param value The bytes for kegType to set.
       * @return This builder for chaining.
       */
      public Builder setKegTypeBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
        kegType_ = value;
        onChanged();
        return this;
      }

      private double remainingVolumeMl_ ;
      /**
       * <pre>
       * Volume remaining in the keg, in milliliters.
       * </pre>
       *
       * <code>required double remaining_volume_ml = 3;</code>
       * @return Whether the remainingVolumeMl field is set.
       */
      @java.lang.Override
      public boolean hasRemainingVolumeMl() {
        return ((bitField0_ & 0x00000004) != 0);
      }
      /**
       * <pre>
       * Volume remaining in the keg, in milliliters.
       * </pre>
       *
       * <code>required double remaining_volume_ml = 3;</code>
       * @return The remainingVolumeMl.
       */
      @java.lang.Override
      public double getRemainingVolumeMl() {
        return remainingVolumeMl_;
      }
      /**
       * <pre>
       * Volume remaining in the keg, in milliliters.
       * </pre>
       *
       * <code>required double remaining_volume_ml = 3;</code>
       * @param value The remainingVolumeMl to set.
       * @return This builder for chaining.
       */
      public Builder setRemainingVolumeMl(double value) {
        bitField0_ |= 0x00000004;
        remainingVolumeMl_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Volume remaining in the keg, in milliliters.
       * </pre>
       *
       * <code>required double remaining_volume_ml = 3;</code>
       * @return This builder for chaining.
       */
      public Builder clearRemainingVolumeMl() {
        bitField0_ = (bitField0_ & ~0x00000004);
        remainingVolumeMl_ = 0D;
        onChanged();
        return this;
      }

      private double fullVolumeMl_ ;
      /**
       * <pre>
       * Initial volume.
       * </pre>
       *
       * <code>required double full_volume_ml = 4;</code>
       * @return Whether the fullVolumeMl field is set.
       */
      @java.lang.Override
      public boolean hasFullVolumeMl() {
        return ((bitField0_ & 0x00000008) != 0);
      }
      /**
       * <pre>
       * Initial volume.
       * </pre>
       *
       * <code>required double full_volume_ml = 4;</code>
       * @return The fullVolumeMl.
       */
      @java.lang.Override
      public double getFullVolumeMl() {
        return fullVolumeMl_;
      }
      /**
       * <pre>
       * Initial volume.
       * </pre>
       *
       * <code>required double full_volume_ml = 4;</code>
       * @param value The fullVolumeMl to set.
       * @return This builder for chaining.
       */
      public Builder setFullVolumeMl(double value) {
        bitField0_ |= 0x00000008;
        fullVolumeMl_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Initial volume.
       * </pre>
       *
       * <code>required double full_volume_ml = 4;</code>
       * @return This builder for chaining.
       */
      public Builder clearFullVolumeMl() {
        bitField0_ = (bitField0_ & ~0x00000008);
        fullVolumeMl_ = 0D;
        onChanged();
        return this;
      }

      private double servedVolumeMl_ ;
      /**
       * <pre>
       * Served volume.
       * </pre>
       *
       * <code>required double served_volume_ml = 5;</code>
       * @return Whether the servedVolumeMl field is set.
       */
      @java.lang.Override
      public boolean hasServedVolumeMl() {
        return ((bitField0_ & 0x00000010) != 0);
      }
      /**
       * <pre>
       * Served volume.
       * </pre>
       *
       * <code>required double served_volume_ml = 5;</code>
       * @return The servedVolumeMl.
       */
      @java.lang.Override
      public double getServedVolumeMl() {
        return servedVolumeMl_;
      }
      /**
       * <pre>
       * Served volume.
       * </pre>
       *
       * <code>required double served_volume_ml = 5;</code>
       * @param value The servedVolumeMl to set.
       * @return This builder for chaining.
       */
      public Builder setServedVolumeMl(double value) {
        bitField0_ |= 0x00000010;
        servedVolumeMl_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Served volume.
       * </pre>
       *
       * <code>required double served_volume_ml = 5;</code>
       * @return This builder for chaining.
       */
      public Builder clearServedVolumeMl() {
        bitField0_ = (bitField0_ & ~0x00000010);
        servedVolumeMl_ = 0D;
        onChanged();
        return this;
      }

      private double spilledVolumeMl_ ;
      /**
       * <pre>
       * Total portion of the original volume that was spoiled, in milliliters.
       * Spilled volume is not attributed to any drink, but deducts from the keg
       * total.
       * </pre>
       *
       * <code>required double spilled_volume_ml = 6;</code>
       * @return Whether the spilledVolumeMl field is set.
       */
      @java.lang.Override
      public boolean hasSpilledVolumeMl() {
        return ((bitField0_ & 0x00000020) != 0);
      }
      /**
       * <pre>
       * Total portion of the original volume that was spoiled, in milliliters.
       * Spilled volume is not attributed to any drink, but deducts from the keg
       * total.
       * </pre>
       *
       * <code>required double spilled_volume_ml = 6;</code>
       * @return The spilledVolumeMl.
       */
      @java.lang.Override
      public double getSpilledVolumeMl() {
        return spilledVolumeMl_;
      }
      /**
       * <pre>
       * Total portion of the original volume that was spoiled, in milliliters.
       * Spilled volume is not attributed to any drink, but deducts from the keg
       * total.
       * </pre>
       *
       * <code>required double spilled_volume_ml = 6;</code>
       * @param value The spilledVolumeMl to set.
       * @return This builder for chaining.
       */
      public Builder setSpilledVolumeMl(double value) {
        bitField0_ |= 0x00000020;
        spilledVolumeMl_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Total portion of the original volume that was spoiled, in milliliters.
       * Spilled volume is not attributed to any drink, but deducts from the keg
       * total.
       * </pre>
       *
       * <code>required double spilled_volume_ml = 6;</code>
       * @return This builder for chaining.
       */
      public Builder clearSpilledVolumeMl() {
        bitField0_ = (bitField0_ & ~0x00000020);
        spilledVolumeMl_ = 0D;
        onChanged();
        return this;
      }

      private double percentFull_ ;
      /**
       * <pre>
       * Percentage of the keg that remains, as a value between 0 and 100.
       * </pre>
       *
       * <code>required double percent_full = 7;</code>
       * @return Whether the percentFull field is set.
       */
      @java.lang.Override
      public boolean hasPercentFull() {
        return ((bitField0_ & 0x00000040) != 0);
      }
      /**
       * <pre>
       * Percentage of the keg that remains, as a value between 0 and 100.
       * </pre>
       *
       * <code>required double percent_full = 7;</code>
       * @return The percentFull.
       */
      @java.lang.Override
      public double getPercentFull() {
        return percentFull_;
      }
      /**
       * <pre>
       * Percentage of the keg that remains, as a value between 0 and 100.
       * </pre>
       *
       * <code>required double percent_full = 7;</code>
       * @param value The percentFull to set.
       * @return This builder for chaining.
       */
      public Builder setPercentFull(double value) {
        bitField0_ |= 0x00000040;
        percentFull_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Percentage of the keg that remains, as a value between 0 and 100.
       * </pre>
       *
       * <code>required double percent_full = 7;</code>
       * @return This builder for chaining.
       */
      public Builder clearPercentFull() {
        bitField0_ = (bitField0_ & ~0x00000040);
        percentFull_ = 0D;
        onChanged();
        return this;
      }

      private java.lang.Object startTime_ = "";
      /**
       * <pre>
       * UTC time when the keg was started or tapped, as an ISO8061 UTC timestamp.
       * </pre>
       *
       * <code>optional string start_time = 8;</code>
       * @return Whether the startTime field is set.
       */
      public boolean hasStartTime() {
        return ((bitField0_ & 0x00000080) != 0);
      }
      /**
       * <pre>
       * UTC time when the keg was started or tapped, as an ISO8061 UTC timestamp.
       * </pre>
       *
       * <code>optional string start_time = 8;</code>
       * @return The startTime.
       */
      public java.lang.String getStartTime() {
        java.lang.Object ref = startTime_;
        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()) {
            startTime_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * UTC time when the keg was started or tapped, as an ISO8061 UTC timestamp.
       * </pre>
       *
       * <code>optional string start_time = 8;</code>
       * @return The bytes for startTime.
       */
      public com.google.protobuf.ByteString
          getStartTimeBytes() {
        java.lang.Object ref = startTime_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          startTime_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * UTC time when the keg was started or tapped, as an ISO8061 UTC timestamp.
       * </pre>
       *
       * <code>optional string start_time = 8;</code>
       * @param value The startTime to set.
       * @return This builder for chaining.
       */
      public Builder setStartTime(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000080;
        startTime_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * UTC time when the keg was started or tapped, as an ISO8061 UTC timestamp.
       * </pre>
       *
       * <code>optional string start_time = 8;</code>
       * @return This builder for chaining.
       */
      public Builder clearStartTime() {
        bitField0_ = (bitField0_ & ~0x00000080);
        startTime_ = getDefaultInstance().getStartTime();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * UTC time when the keg was started or tapped, as an ISO8061 UTC timestamp.
       * </pre>
       *
       * <code>optional string start_time = 8;</code>
       * @param value The bytes for startTime to set.
       * @return This builder for chaining.
       */
      public Builder setStartTimeBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000080;
        startTime_ = value;
        onChanged();
        return this;
      }

      private java.lang.Object endTime_ = "";
      /**
       * <pre>
       * Local time when the keg was completed, as an ISO8061 UTC timestamp.  This
       * should be no sooner than the time of the most recent drink.  If the keg's
       * `status` is not 'offline', this value is undefined.
       * </pre>
       *
       * <code>optional string end_time = 9;</code>
       * @return Whether the endTime field is set.
       */
      public boolean hasEndTime() {
        return ((bitField0_ & 0x00000100) != 0);
      }
      /**
       * <pre>
       * Local time when the keg was completed, as an ISO8061 UTC timestamp.  This
       * should be no sooner than the time of the most recent drink.  If the keg's
       * `status` is not 'offline', this value is undefined.
       * </pre>
       *
       * <code>optional string end_time = 9;</code>
       * @return The endTime.
       */
      public java.lang.String getEndTime() {
        java.lang.Object ref = endTime_;
        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()) {
            endTime_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * Local time when the keg was completed, as an ISO8061 UTC timestamp.  This
       * should be no sooner than the time of the most recent drink.  If the keg's
       * `status` is not 'offline', this value is undefined.
       * </pre>
       *
       * <code>optional string end_time = 9;</code>
       * @return The bytes for endTime.
       */
      public com.google.protobuf.ByteString
          getEndTimeBytes() {
        java.lang.Object ref = endTime_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          endTime_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * Local time when the keg was completed, as an ISO8061 UTC timestamp.  This
       * should be no sooner than the time of the most recent drink.  If the keg's
       * `status` is not 'offline', this value is undefined.
       * </pre>
       *
       * <code>optional string end_time = 9;</code>
       * @param value The endTime to set.
       * @return This builder for chaining.
       */
      public Builder setEndTime(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000100;
        endTime_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Local time when the keg was completed, as an ISO8061 UTC timestamp.  This
       * should be no sooner than the time of the most recent drink.  If the keg's
       * `status` is not 'offline', this value is undefined.
       * </pre>
       *
       * <code>optional string end_time = 9;</code>
       * @return This builder for chaining.
       */
      public Builder clearEndTime() {
        bitField0_ = (bitField0_ & ~0x00000100);
        endTime_ = getDefaultInstance().getEndTime();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Local time when the keg was completed, as an ISO8061 UTC timestamp.  This
       * should be no sooner than the time of the most recent drink.  If the keg's
       * `status` is not 'offline', this value is undefined.
       * </pre>
       *
       * <code>optional string end_time = 9;</code>
       * @param value The bytes for endTime to set.
       * @return This builder for chaining.
       */
      public Builder setEndTimeBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000100;
        endTime_ = value;
        onChanged();
        return this;
      }

      private boolean online_ ;
      /**
       * <pre>
       * True if the Keg is currently online.
       * </pre>
       *
       * <code>optional bool online = 10;</code>
       * @return Whether the online field is set.
       */
      @java.lang.Override
      public boolean hasOnline() {
        return ((bitField0_ & 0x00000200) != 0);
      }
      /**
       * <pre>
       * True if the Keg is currently online.
       * </pre>
       *
       * <code>optional bool online = 10;</code>
       * @return The online.
       */
      @java.lang.Override
      public boolean getOnline() {
        return online_;
      }
      /**
       * <pre>
       * True if the Keg is currently online.
       * </pre>
       *
       * <code>optional bool online = 10;</code>
       * @param value The online to set.
       * @return This builder for chaining.
       */
      public Builder setOnline(boolean value) {
        bitField0_ |= 0x00000200;
        online_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * True if the Keg is currently online.
       * </pre>
       *
       * <code>optional bool online = 10;</code>
       * @return This builder for chaining.
       */
      public Builder clearOnline() {
        bitField0_ = (bitField0_ & ~0x00000200);
        online_ = false;
        onChanged();
        return this;
      }

      private java.lang.Object description_ = "";
      /**
       * <pre>
       * The adminstrator's description of this keg.
       * </pre>
       *
       * <code>optional string description = 11;</code>
       * @return Whether the description field is set.
       */
      public boolean hasDescription() {
        return ((bitField0_ & 0x00000400) != 0);
      }
      /**
       * <pre>
       * The adminstrator's description of this keg.
       * </pre>
       *
       * <code>optional string description = 11;</code>
       * @return The description.
       */
      public java.lang.String getDescription() {
        java.lang.Object ref = description_;
        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()) {
            description_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * The adminstrator's description of this keg.
       * </pre>
       *
       * <code>optional string description = 11;</code>
       * @return The bytes for description.
       */
      public com.google.protobuf.ByteString
          getDescriptionBytes() {
        java.lang.Object ref = description_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          description_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * The adminstrator's description of this keg.
       * </pre>
       *
       * <code>optional string description = 11;</code>
       * @param value The description to set.
       * @return This builder for chaining.
       */
      public Builder setDescription(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000400;
        description_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The adminstrator's description of this keg.
       * </pre>
       *
       * <code>optional string description = 11;</code>
       * @return This builder for chaining.
       */
      public Builder clearDescription() {
        bitField0_ = (bitField0_ & ~0x00000400);
        description_ = getDefaultInstance().getDescription();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The adminstrator's description of this keg.
       * </pre>
       *
       * <code>optional string description = 11;</code>
       * @param value The bytes for description to set.
       * @return This builder for chaining.
       */
      public Builder setDescriptionBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000400;
        description_ = value;
        onChanged();
        return this;
      }

      private org.kegbot.proto.Models.Beverage beverage_;
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.Beverage, org.kegbot.proto.Models.Beverage.Builder, org.kegbot.proto.Models.BeverageOrBuilder> beverageBuilder_;
      /**
       * <pre>
       * Beverage type.
       * </pre>
       *
       * <code>optional .Beverage beverage = 12;</code>
       * @return Whether the beverage field is set.
       */
      public boolean hasBeverage() {
        return ((bitField0_ & 0x00000800) != 0);
      }
      /**
       * <pre>
       * Beverage type.
       * </pre>
       *
       * <code>optional .Beverage beverage = 12;</code>
       * @return The beverage.
       */
      public org.kegbot.proto.Models.Beverage getBeverage() {
        if (beverageBuilder_ == null) {
          return beverage_ == null ? org.kegbot.proto.Models.Beverage.getDefaultInstance() : beverage_;
        } else {
          return beverageBuilder_.getMessage();
        }
      }
      /**
       * <pre>
       * Beverage type.
       * </pre>
       *
       * <code>optional .Beverage beverage = 12;</code>
       */
      public Builder setBeverage(org.kegbot.proto.Models.Beverage value) {
        if (beverageBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          beverage_ = value;
          onChanged();
        } else {
          beverageBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000800;
        return this;
      }
      /**
       * <pre>
       * Beverage type.
       * </pre>
       *
       * <code>optional .Beverage beverage = 12;</code>
       */
      public Builder setBeverage(
          org.kegbot.proto.Models.Beverage.Builder builderForValue) {
        if (beverageBuilder_ == null) {
          beverage_ = builderForValue.build();
          onChanged();
        } else {
          beverageBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000800;
        return this;
      }
      /**
       * <pre>
       * Beverage type.
       * </pre>
       *
       * <code>optional .Beverage beverage = 12;</code>
       */
      public Builder mergeBeverage(org.kegbot.proto.Models.Beverage value) {
        if (beverageBuilder_ == null) {
          if (((bitField0_ & 0x00000800) != 0) &&
              beverage_ != null &&
              beverage_ != org.kegbot.proto.Models.Beverage.getDefaultInstance()) {
            beverage_ =
              org.kegbot.proto.Models.Beverage.newBuilder(beverage_).mergeFrom(value).buildPartial();
          } else {
            beverage_ = value;
          }
          onChanged();
        } else {
          beverageBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000800;
        return this;
      }
      /**
       * <pre>
       * Beverage type.
       * </pre>
       *
       * <code>optional .Beverage beverage = 12;</code>
       */
      public Builder clearBeverage() {
        if (beverageBuilder_ == null) {
          beverage_ = null;
          onChanged();
        } else {
          beverageBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000800);
        return this;
      }
      /**
       * <pre>
       * Beverage type.
       * </pre>
       *
       * <code>optional .Beverage beverage = 12;</code>
       */
      public org.kegbot.proto.Models.Beverage.Builder getBeverageBuilder() {
        bitField0_ |= 0x00000800;
        onChanged();
        return getBeverageFieldBuilder().getBuilder();
      }
      /**
       * <pre>
       * Beverage type.
       * </pre>
       *
       * <code>optional .Beverage beverage = 12;</code>
       */
      public org.kegbot.proto.Models.BeverageOrBuilder getBeverageOrBuilder() {
        if (beverageBuilder_ != null) {
          return beverageBuilder_.getMessageOrBuilder();
        } else {
          return beverage_ == null ?
              org.kegbot.proto.Models.Beverage.getDefaultInstance() : beverage_;
        }
      }
      /**
       * <pre>
       * Beverage type.
       * </pre>
       *
       * <code>optional .Beverage beverage = 12;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.Beverage, org.kegbot.proto.Models.Beverage.Builder, org.kegbot.proto.Models.BeverageOrBuilder> 
          getBeverageFieldBuilder() {
        if (beverageBuilder_ == null) {
          beverageBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              org.kegbot.proto.Models.Beverage, org.kegbot.proto.Models.Beverage.Builder, org.kegbot.proto.Models.BeverageOrBuilder>(
                  getBeverage(),
                  getParentForChildren(),
                  isClean());
          beverage_ = null;
        }
        return beverageBuilder_;
      }

      private java.lang.Object illustrationUrl_ = "";
      /**
       * <code>optional string illustration_url = 21;</code>
       * @return Whether the illustrationUrl field is set.
       */
      public boolean hasIllustrationUrl() {
        return ((bitField0_ & 0x00001000) != 0);
      }
      /**
       * <code>optional string illustration_url = 21;</code>
       * @return The illustrationUrl.
       */
      public java.lang.String getIllustrationUrl() {
        java.lang.Object ref = illustrationUrl_;
        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()) {
            illustrationUrl_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string illustration_url = 21;</code>
       * @return The bytes for illustrationUrl.
       */
      public com.google.protobuf.ByteString
          getIllustrationUrlBytes() {
        java.lang.Object ref = illustrationUrl_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          illustrationUrl_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string illustration_url = 21;</code>
       * @param value The illustrationUrl to set.
       * @return This builder for chaining.
       */
      public Builder setIllustrationUrl(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00001000;
        illustrationUrl_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string illustration_url = 21;</code>
       * @return This builder for chaining.
       */
      public Builder clearIllustrationUrl() {
        bitField0_ = (bitField0_ & ~0x00001000);
        illustrationUrl_ = getDefaultInstance().getIllustrationUrl();
        onChanged();
        return this;
      }
      /**
       * <code>optional string illustration_url = 21;</code>
       * @param value The bytes for illustrationUrl to set.
       * @return This builder for chaining.
       */
      public Builder setIllustrationUrlBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00001000;
        illustrationUrl_ = value;
        onChanged();
        return this;
      }

      private java.lang.Object illustrationThumbnailUrl_ = "";
      /**
       * <code>optional string illustration_thumbnail_url = 22;</code>
       * @return Whether the illustrationThumbnailUrl field is set.
       */
      public boolean hasIllustrationThumbnailUrl() {
        return ((bitField0_ & 0x00002000) != 0);
      }
      /**
       * <code>optional string illustration_thumbnail_url = 22;</code>
       * @return The illustrationThumbnailUrl.
       */
      public java.lang.String getIllustrationThumbnailUrl() {
        java.lang.Object ref = illustrationThumbnailUrl_;
        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()) {
            illustrationThumbnailUrl_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string illustration_thumbnail_url = 22;</code>
       * @return The bytes for illustrationThumbnailUrl.
       */
      public com.google.protobuf.ByteString
          getIllustrationThumbnailUrlBytes() {
        java.lang.Object ref = illustrationThumbnailUrl_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          illustrationThumbnailUrl_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string illustration_thumbnail_url = 22;</code>
       * @param value The illustrationThumbnailUrl to set.
       * @return This builder for chaining.
       */
      public Builder setIllustrationThumbnailUrl(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00002000;
        illustrationThumbnailUrl_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string illustration_thumbnail_url = 22;</code>
       * @return This builder for chaining.
       */
      public Builder clearIllustrationThumbnailUrl() {
        bitField0_ = (bitField0_ & ~0x00002000);
        illustrationThumbnailUrl_ = getDefaultInstance().getIllustrationThumbnailUrl();
        onChanged();
        return this;
      }
      /**
       * <code>optional string illustration_thumbnail_url = 22;</code>
       * @param value The bytes for illustrationThumbnailUrl to set.
       * @return This builder for chaining.
       */
      public Builder setIllustrationThumbnailUrlBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00002000;
        illustrationThumbnailUrl_ = value;
        onChanged();
        return this;
      }

      private org.kegbot.proto.Models.BeerType type_;
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.BeerType, org.kegbot.proto.Models.BeerType.Builder, org.kegbot.proto.Models.BeerTypeOrBuilder> typeBuilder_;
      /**
       * <code>optional .BeerType type = 13 [deprecated = true];</code>
       * @deprecated
       * @return Whether the type field is set.
       */
      @java.lang.Deprecated public boolean hasType() {
        return ((bitField0_ & 0x00004000) != 0);
      }
      /**
       * <code>optional .BeerType type = 13 [deprecated = true];</code>
       * @deprecated
       * @return The type.
       */
      @java.lang.Deprecated public org.kegbot.proto.Models.BeerType getType() {
        if (typeBuilder_ == null) {
          return type_ == null ? org.kegbot.proto.Models.BeerType.getDefaultInstance() : type_;
        } else {
          return typeBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .BeerType type = 13 [deprecated = true];</code>
       */
      @java.lang.Deprecated public Builder setType(org.kegbot.proto.Models.BeerType value) {
        if (typeBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          type_ = value;
          onChanged();
        } else {
          typeBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00004000;
        return this;
      }
      /**
       * <code>optional .BeerType type = 13 [deprecated = true];</code>
       */
      @java.lang.Deprecated public Builder setType(
          org.kegbot.proto.Models.BeerType.Builder builderForValue) {
        if (typeBuilder_ == null) {
          type_ = builderForValue.build();
          onChanged();
        } else {
          typeBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00004000;
        return this;
      }
      /**
       * <code>optional .BeerType type = 13 [deprecated = true];</code>
       */
      @java.lang.Deprecated public Builder mergeType(org.kegbot.proto.Models.BeerType value) {
        if (typeBuilder_ == null) {
          if (((bitField0_ & 0x00004000) != 0) &&
              type_ != null &&
              type_ != org.kegbot.proto.Models.BeerType.getDefaultInstance()) {
            type_ =
              org.kegbot.proto.Models.BeerType.newBuilder(type_).mergeFrom(value).buildPartial();
          } else {
            type_ = value;
          }
          onChanged();
        } else {
          typeBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00004000;
        return this;
      }
      /**
       * <code>optional .BeerType type = 13 [deprecated = true];</code>
       */
      @java.lang.Deprecated public Builder clearType() {
        if (typeBuilder_ == null) {
          type_ = null;
          onChanged();
        } else {
          typeBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00004000);
        return this;
      }
      /**
       * <code>optional .BeerType type = 13 [deprecated = true];</code>
       */
      @java.lang.Deprecated public org.kegbot.proto.Models.BeerType.Builder getTypeBuilder() {
        bitField0_ |= 0x00004000;
        onChanged();
        return getTypeFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .BeerType type = 13 [deprecated = true];</code>
       */
      @java.lang.Deprecated public org.kegbot.proto.Models.BeerTypeOrBuilder getTypeOrBuilder() {
        if (typeBuilder_ != null) {
          return typeBuilder_.getMessageOrBuilder();
        } else {
          return type_ == null ?
              org.kegbot.proto.Models.BeerType.getDefaultInstance() : type_;
        }
      }
      /**
       * <code>optional .BeerType type = 13 [deprecated = true];</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.BeerType, org.kegbot.proto.Models.BeerType.Builder, org.kegbot.proto.Models.BeerTypeOrBuilder> 
          getTypeFieldBuilder() {
        if (typeBuilder_ == null) {
          typeBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              org.kegbot.proto.Models.BeerType, org.kegbot.proto.Models.BeerType.Builder, org.kegbot.proto.Models.BeerTypeOrBuilder>(
                  getType(),
                  getParentForChildren(),
                  isClean());
          type_ = null;
        }
        return typeBuilder_;
      }

      private java.lang.Object typeId_ = "";
      /**
       * <code>optional string type_id = 14 [deprecated = true];</code>
       * @deprecated
       * @return Whether the typeId field is set.
       */
      @java.lang.Deprecated public boolean hasTypeId() {
        return ((bitField0_ & 0x00008000) != 0);
      }
      /**
       * <code>optional string type_id = 14 [deprecated = true];</code>
       * @deprecated
       * @return The typeId.
       */
      @java.lang.Deprecated public java.lang.String getTypeId() {
        java.lang.Object ref = typeId_;
        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()) {
            typeId_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string type_id = 14 [deprecated = true];</code>
       * @deprecated
       * @return The bytes for typeId.
       */
      @java.lang.Deprecated public com.google.protobuf.ByteString
          getTypeIdBytes() {
        java.lang.Object ref = typeId_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          typeId_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string type_id = 14 [deprecated = true];</code>
       * @deprecated
       * @param value The typeId to set.
       * @return This builder for chaining.
       */
      @java.lang.Deprecated public Builder setTypeId(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00008000;
        typeId_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string type_id = 14 [deprecated = true];</code>
       * @deprecated
       * @return This builder for chaining.
       */
      @java.lang.Deprecated public Builder clearTypeId() {
        bitField0_ = (bitField0_ & ~0x00008000);
        typeId_ = getDefaultInstance().getTypeId();
        onChanged();
        return this;
      }
      /**
       * <code>optional string type_id = 14 [deprecated = true];</code>
       * @deprecated
       * @param value The bytes for typeId to set.
       * @return This builder for chaining.
       */
      @java.lang.Deprecated public Builder setTypeIdBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00008000;
        typeId_ = value;
        onChanged();
        return this;
      }

      private int sizeId_ ;
      /**
       * <code>optional uint32 size_id = 15 [deprecated = true];</code>
       * @deprecated
       * @return Whether the sizeId field is set.
       */
      @java.lang.Override
      @java.lang.Deprecated public boolean hasSizeId() {
        return ((bitField0_ & 0x00010000) != 0);
      }
      /**
       * <code>optional uint32 size_id = 15 [deprecated = true];</code>
       * @deprecated
       * @return The sizeId.
       */
      @java.lang.Override
      @java.lang.Deprecated public int getSizeId() {
        return sizeId_;
      }
      /**
       * <code>optional uint32 size_id = 15 [deprecated = true];</code>
       * @deprecated
       * @param value The sizeId to set.
       * @return This builder for chaining.
       */
      @java.lang.Deprecated public Builder setSizeId(int value) {
        bitField0_ |= 0x00010000;
        sizeId_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional uint32 size_id = 15 [deprecated = true];</code>
       * @deprecated
       * @return This builder for chaining.
       */
      @java.lang.Deprecated public Builder clearSizeId() {
        bitField0_ = (bitField0_ & ~0x00010000);
        sizeId_ = 0;
        onChanged();
        return this;
      }

      private org.kegbot.proto.Models.KegSize size_;
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.KegSize, org.kegbot.proto.Models.KegSize.Builder, org.kegbot.proto.Models.KegSizeOrBuilder> sizeBuilder_;
      /**
       * <code>optional .KegSize size = 16 [deprecated = true];</code>
       * @deprecated
       * @return Whether the size field is set.
       */
      @java.lang.Deprecated public boolean hasSize() {
        return ((bitField0_ & 0x00020000) != 0);
      }
      /**
       * <code>optional .KegSize size = 16 [deprecated = true];</code>
       * @deprecated
       * @return The size.
       */
      @java.lang.Deprecated public org.kegbot.proto.Models.KegSize getSize() {
        if (sizeBuilder_ == null) {
          return size_ == null ? org.kegbot.proto.Models.KegSize.getDefaultInstance() : size_;
        } else {
          return sizeBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .KegSize size = 16 [deprecated = true];</code>
       */
      @java.lang.Deprecated public Builder setSize(org.kegbot.proto.Models.KegSize value) {
        if (sizeBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          size_ = value;
          onChanged();
        } else {
          sizeBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00020000;
        return this;
      }
      /**
       * <code>optional .KegSize size = 16 [deprecated = true];</code>
       */
      @java.lang.Deprecated public Builder setSize(
          org.kegbot.proto.Models.KegSize.Builder builderForValue) {
        if (sizeBuilder_ == null) {
          size_ = builderForValue.build();
          onChanged();
        } else {
          sizeBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00020000;
        return this;
      }
      /**
       * <code>optional .KegSize size = 16 [deprecated = true];</code>
       */
      @java.lang.Deprecated public Builder mergeSize(org.kegbot.proto.Models.KegSize value) {
        if (sizeBuilder_ == null) {
          if (((bitField0_ & 0x00020000) != 0) &&
              size_ != null &&
              size_ != org.kegbot.proto.Models.KegSize.getDefaultInstance()) {
            size_ =
              org.kegbot.proto.Models.KegSize.newBuilder(size_).mergeFrom(value).buildPartial();
          } else {
            size_ = value;
          }
          onChanged();
        } else {
          sizeBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00020000;
        return this;
      }
      /**
       * <code>optional .KegSize size = 16 [deprecated = true];</code>
       */
      @java.lang.Deprecated public Builder clearSize() {
        if (sizeBuilder_ == null) {
          size_ = null;
          onChanged();
        } else {
          sizeBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00020000);
        return this;
      }
      /**
       * <code>optional .KegSize size = 16 [deprecated = true];</code>
       */
      @java.lang.Deprecated public org.kegbot.proto.Models.KegSize.Builder getSizeBuilder() {
        bitField0_ |= 0x00020000;
        onChanged();
        return getSizeFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .KegSize size = 16 [deprecated = true];</code>
       */
      @java.lang.Deprecated public org.kegbot.proto.Models.KegSizeOrBuilder getSizeOrBuilder() {
        if (sizeBuilder_ != null) {
          return sizeBuilder_.getMessageOrBuilder();
        } else {
          return size_ == null ?
              org.kegbot.proto.Models.KegSize.getDefaultInstance() : size_;
        }
      }
      /**
       * <code>optional .KegSize size = 16 [deprecated = true];</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.KegSize, org.kegbot.proto.Models.KegSize.Builder, org.kegbot.proto.Models.KegSizeOrBuilder> 
          getSizeFieldBuilder() {
        if (sizeBuilder_ == null) {
          sizeBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              org.kegbot.proto.Models.KegSize, org.kegbot.proto.Models.KegSize.Builder, org.kegbot.proto.Models.KegSizeOrBuilder>(
                  getSize(),
                  getParentForChildren(),
                  isClean());
          size_ = null;
        }
        return sizeBuilder_;
      }

      private java.lang.Object sizeName_ = "";
      /**
       * <code>optional string size_name = 17 [deprecated = true];</code>
       * @deprecated
       * @return Whether the sizeName field is set.
       */
      @java.lang.Deprecated public boolean hasSizeName() {
        return ((bitField0_ & 0x00040000) != 0);
      }
      /**
       * <code>optional string size_name = 17 [deprecated = true];</code>
       * @deprecated
       * @return The sizeName.
       */
      @java.lang.Deprecated public java.lang.String getSizeName() {
        java.lang.Object ref = sizeName_;
        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()) {
            sizeName_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string size_name = 17 [deprecated = true];</code>
       * @deprecated
       * @return The bytes for sizeName.
       */
      @java.lang.Deprecated public com.google.protobuf.ByteString
          getSizeNameBytes() {
        java.lang.Object ref = sizeName_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          sizeName_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string size_name = 17 [deprecated = true];</code>
       * @deprecated
       * @param value The sizeName to set.
       * @return This builder for chaining.
       */
      @java.lang.Deprecated public Builder setSizeName(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00040000;
        sizeName_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string size_name = 17 [deprecated = true];</code>
       * @deprecated
       * @return This builder for chaining.
       */
      @java.lang.Deprecated public Builder clearSizeName() {
        bitField0_ = (bitField0_ & ~0x00040000);
        sizeName_ = getDefaultInstance().getSizeName();
        onChanged();
        return this;
      }
      /**
       * <code>optional string size_name = 17 [deprecated = true];</code>
       * @deprecated
       * @param value The bytes for sizeName to set.
       * @return This builder for chaining.
       */
      @java.lang.Deprecated public Builder setSizeNameBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00040000;
        sizeName_ = value;
        onChanged();
        return this;
      }

      private double sizeVolumeMl_ ;
      /**
       * <code>optional double size_volume_ml = 18 [deprecated = true];</code>
       * @deprecated
       * @return Whether the sizeVolumeMl field is set.
       */
      @java.lang.Override
      @java.lang.Deprecated public boolean hasSizeVolumeMl() {
        return ((bitField0_ & 0x00080000) != 0);
      }
      /**
       * <code>optional double size_volume_ml = 18 [deprecated = true];</code>
       * @deprecated
       * @return The sizeVolumeMl.
       */
      @java.lang.Override
      @java.lang.Deprecated public double getSizeVolumeMl() {
        return sizeVolumeMl_;
      }
      /**
       * <code>optional double size_volume_ml = 18 [deprecated = true];</code>
       * @deprecated
       * @param value The sizeVolumeMl to set.
       * @return This builder for chaining.
       */
      @java.lang.Deprecated public Builder setSizeVolumeMl(double value) {
        bitField0_ |= 0x00080000;
        sizeVolumeMl_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional double size_volume_ml = 18 [deprecated = true];</code>
       * @deprecated
       * @return This builder for chaining.
       */
      @java.lang.Deprecated public Builder clearSizeVolumeMl() {
        bitField0_ = (bitField0_ & ~0x00080000);
        sizeVolumeMl_ = 0D;
        onChanged();
        return this;
      }

      private double volumeMlRemain_ ;
      /**
       * <code>optional double volume_ml_remain = 19 [deprecated = true];</code>
       * @deprecated
       * @return Whether the volumeMlRemain field is set.
       */
      @java.lang.Override
      @java.lang.Deprecated public boolean hasVolumeMlRemain() {
        return ((bitField0_ & 0x00100000) != 0);
      }
      /**
       * <code>optional double volume_ml_remain = 19 [deprecated = true];</code>
       * @deprecated
       * @return The volumeMlRemain.
       */
      @java.lang.Override
      @java.lang.Deprecated public double getVolumeMlRemain() {
        return volumeMlRemain_;
      }
      /**
       * <code>optional double volume_ml_remain = 19 [deprecated = true];</code>
       * @deprecated
       * @param value The volumeMlRemain to set.
       * @return This builder for chaining.
       */
      @java.lang.Deprecated public Builder setVolumeMlRemain(double value) {
        bitField0_ |= 0x00100000;
        volumeMlRemain_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional double volume_ml_remain = 19 [deprecated = true];</code>
       * @deprecated
       * @return This builder for chaining.
       */
      @java.lang.Deprecated public Builder clearVolumeMlRemain() {
        bitField0_ = (bitField0_ & ~0x00100000);
        volumeMlRemain_ = 0D;
        onChanged();
        return this;
      }

      private double spilledMl_ ;
      /**
       * <code>optional double spilled_ml = 20 [deprecated = true];</code>
       * @deprecated
       * @return Whether the spilledMl field is set.
       */
      @java.lang.Override
      @java.lang.Deprecated public boolean hasSpilledMl() {
        return ((bitField0_ & 0x00200000) != 0);
      }
      /**
       * <code>optional double spilled_ml = 20 [deprecated = true];</code>
       * @deprecated
       * @return The spilledMl.
       */
      @java.lang.Override
      @java.lang.Deprecated public double getSpilledMl() {
        return spilledMl_;
      }
      /**
       * <code>optional double spilled_ml = 20 [deprecated = true];</code>
       * @deprecated
       * @param value The spilledMl to set.
       * @return This builder for chaining.
       */
      @java.lang.Deprecated public Builder setSpilledMl(double value) {
        bitField0_ |= 0x00200000;
        spilledMl_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional double spilled_ml = 20 [deprecated = true];</code>
       * @deprecated
       * @return This builder for chaining.
       */
      @java.lang.Deprecated public Builder clearSpilledMl() {
        bitField0_ = (bitField0_ & ~0x00200000);
        spilledMl_ = 0D;
        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:Keg)
    }

    // @@protoc_insertion_point(class_scope:Keg)
    private static final org.kegbot.proto.Models.Keg DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new org.kegbot.proto.Models.Keg();
    }

    public static org.kegbot.proto.Models.Keg getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

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

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

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

    @java.lang.Override
    public org.kegbot.proto.Models.Keg getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface KegSizeOrBuilder extends
      // @@protoc_insertion_point(interface_extends:KegSize)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <pre>
     * The unique identifier for this keg size.
     * </pre>
     *
     * <code>required uint32 id = 1;</code>
     * @return Whether the id field is set.
     */
    boolean hasId();
    /**
     * <pre>
     * The unique identifier for this keg size.
     * </pre>
     *
     * <code>required uint32 id = 1;</code>
     * @return The id.
     */
    int getId();

    /**
     * <pre>
     * The name of the size ("Half Barrel", "Pony keg", ...)
     * </pre>
     *
     * <code>required string name = 2;</code>
     * @return Whether the name field is set.
     */
    boolean hasName();
    /**
     * <pre>
     * The name of the size ("Half Barrel", "Pony keg", ...)
     * </pre>
     *
     * <code>required string name = 2;</code>
     * @return The name.
     */
    java.lang.String getName();
    /**
     * <pre>
     * The name of the size ("Half Barrel", "Pony keg", ...)
     * </pre>
     *
     * <code>required string name = 2;</code>
     * @return The bytes for name.
     */
    com.google.protobuf.ByteString
        getNameBytes();

    /**
     * <pre>
     * The volume of the size, in milliliters.
     * </pre>
     *
     * <code>required double volume_ml = 3;</code>
     * @return Whether the volumeMl field is set.
     */
    boolean hasVolumeMl();
    /**
     * <pre>
     * The volume of the size, in milliliters.
     * </pre>
     *
     * <code>required double volume_ml = 3;</code>
     * @return The volumeMl.
     */
    double getVolumeMl();
  }
  /**
   * <pre>
   * A common keg size.
   * </pre>
   *
   * Protobuf type {@code KegSize}
   */
  public static final class KegSize extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:KegSize)
      KegSizeOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use KegSize.newBuilder() to construct.
    private KegSize(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private KegSize() {
      name_ = "";
    }

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

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return org.kegbot.proto.Models.internal_static_KegSize_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return org.kegbot.proto.Models.internal_static_KegSize_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              org.kegbot.proto.Models.KegSize.class, org.kegbot.proto.Models.KegSize.Builder.class);
    }

    private int bitField0_;
    public static final int ID_FIELD_NUMBER = 1;
    private int id_;
    /**
     * <pre>
     * The unique identifier for this keg size.
     * </pre>
     *
     * <code>required uint32 id = 1;</code>
     * @return Whether the id field is set.
     */
    @java.lang.Override
    public boolean hasId() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <pre>
     * The unique identifier for this keg size.
     * </pre>
     *
     * <code>required uint32 id = 1;</code>
     * @return The id.
     */
    @java.lang.Override
    public int getId() {
      return id_;
    }

    public static final int NAME_FIELD_NUMBER = 2;
    private volatile java.lang.Object name_;
    /**
     * <pre>
     * The name of the size ("Half Barrel", "Pony keg", ...)
     * </pre>
     *
     * <code>required string name = 2;</code>
     * @return Whether the name field is set.
     */
    @java.lang.Override
    public boolean hasName() {
      return ((bitField0_ & 0x00000002) != 0);
    }
    /**
     * <pre>
     * The name of the size ("Half Barrel", "Pony keg", ...)
     * </pre>
     *
     * <code>required 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>
     * The name of the size ("Half Barrel", "Pony keg", ...)
     * </pre>
     *
     * <code>required 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 VOLUME_ML_FIELD_NUMBER = 3;
    private double volumeMl_;
    /**
     * <pre>
     * The volume of the size, in milliliters.
     * </pre>
     *
     * <code>required double volume_ml = 3;</code>
     * @return Whether the volumeMl field is set.
     */
    @java.lang.Override
    public boolean hasVolumeMl() {
      return ((bitField0_ & 0x00000004) != 0);
    }
    /**
     * <pre>
     * The volume of the size, in milliliters.
     * </pre>
     *
     * <code>required double volume_ml = 3;</code>
     * @return The volumeMl.
     */
    @java.lang.Override
    public double getVolumeMl() {
      return volumeMl_;
    }

    public static org.kegbot.proto.Models.KegSize parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.KegSize parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.KegSize parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.KegSize parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.KegSize parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.KegSize parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.KegSize parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.KegSize 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 org.kegbot.proto.Models.KegSize parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.KegSize 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 org.kegbot.proto.Models.KegSize parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.KegSize 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(org.kegbot.proto.Models.KegSize 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 common keg size.
     * </pre>
     *
     * Protobuf type {@code KegSize}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:KegSize)
        org.kegbot.proto.Models.KegSizeOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return org.kegbot.proto.Models.internal_static_KegSize_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return org.kegbot.proto.Models.internal_static_KegSize_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                org.kegbot.proto.Models.KegSize.class, org.kegbot.proto.Models.KegSize.Builder.class);
      }

      // Construct using org.kegbot.proto.Models.KegSize.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);
        name_ = "";
        bitField0_ = (bitField0_ & ~0x00000002);
        volumeMl_ = 0D;
        bitField0_ = (bitField0_ & ~0x00000004);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return org.kegbot.proto.Models.internal_static_KegSize_descriptor;
      }

      @java.lang.Override
      public org.kegbot.proto.Models.KegSize getDefaultInstanceForType() {
        return org.kegbot.proto.Models.KegSize.getDefaultInstance();
      }

      @java.lang.Override
      public org.kegbot.proto.Models.KegSize build() {
        org.kegbot.proto.Models.KegSize result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public org.kegbot.proto.Models.KegSize buildPartial() {
        org.kegbot.proto.Models.KegSize result = new org.kegbot.proto.Models.KegSize(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)) {
          to_bitField0_ |= 0x00000002;
        }
        result.name_ = name_;
        if (((from_bitField0_ & 0x00000004) != 0)) {
          result.volumeMl_ = volumeMl_;
          to_bitField0_ |= 0x00000004;
        }
        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);
      }
      private int bitField0_;

      private int id_ ;
      /**
       * <pre>
       * The unique identifier for this keg size.
       * </pre>
       *
       * <code>required uint32 id = 1;</code>
       * @return Whether the id field is set.
       */
      @java.lang.Override
      public boolean hasId() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <pre>
       * The unique identifier for this keg size.
       * </pre>
       *
       * <code>required uint32 id = 1;</code>
       * @return The id.
       */
      @java.lang.Override
      public int getId() {
        return id_;
      }
      /**
       * <pre>
       * The unique identifier for this keg size.
       * </pre>
       *
       * <code>required uint32 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>
       * The unique identifier for this keg size.
       * </pre>
       *
       * <code>required uint32 id = 1;</code>
       * @return This builder for chaining.
       */
      public Builder clearId() {
        bitField0_ = (bitField0_ & ~0x00000001);
        id_ = 0;
        onChanged();
        return this;
      }

      private java.lang.Object name_ = "";
      /**
       * <pre>
       * The name of the size ("Half Barrel", "Pony keg", ...)
       * </pre>
       *
       * <code>required string name = 2;</code>
       * @return Whether the name field is set.
       */
      public boolean hasName() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <pre>
       * The name of the size ("Half Barrel", "Pony keg", ...)
       * </pre>
       *
       * <code>required 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>
       * The name of the size ("Half Barrel", "Pony keg", ...)
       * </pre>
       *
       * <code>required 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>
       * The name of the size ("Half Barrel", "Pony keg", ...)
       * </pre>
       *
       * <code>required 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>
       * The name of the size ("Half Barrel", "Pony keg", ...)
       * </pre>
       *
       * <code>required string name = 2;</code>
       * @return This builder for chaining.
       */
      public Builder clearName() {
        bitField0_ = (bitField0_ & ~0x00000002);
        name_ = getDefaultInstance().getName();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The name of the size ("Half Barrel", "Pony keg", ...)
       * </pre>
       *
       * <code>required 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 double volumeMl_ ;
      /**
       * <pre>
       * The volume of the size, in milliliters.
       * </pre>
       *
       * <code>required double volume_ml = 3;</code>
       * @return Whether the volumeMl field is set.
       */
      @java.lang.Override
      public boolean hasVolumeMl() {
        return ((bitField0_ & 0x00000004) != 0);
      }
      /**
       * <pre>
       * The volume of the size, in milliliters.
       * </pre>
       *
       * <code>required double volume_ml = 3;</code>
       * @return The volumeMl.
       */
      @java.lang.Override
      public double getVolumeMl() {
        return volumeMl_;
      }
      /**
       * <pre>
       * The volume of the size, in milliliters.
       * </pre>
       *
       * <code>required double volume_ml = 3;</code>
       * @param value The volumeMl to set.
       * @return This builder for chaining.
       */
      public Builder setVolumeMl(double value) {
        bitField0_ |= 0x00000004;
        volumeMl_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The volume of the size, in milliliters.
       * </pre>
       *
       * <code>required double volume_ml = 3;</code>
       * @return This builder for chaining.
       */
      public Builder clearVolumeMl() {
        bitField0_ = (bitField0_ & ~0x00000004);
        volumeMl_ = 0D;
        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:KegSize)
    }

    // @@protoc_insertion_point(class_scope:KegSize)
    private static final org.kegbot.proto.Models.KegSize DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new org.kegbot.proto.Models.KegSize();
    }

    public static org.kegbot.proto.Models.KegSize getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

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

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

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

    @java.lang.Override
    public org.kegbot.proto.Models.KegSize getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface ControllerOrBuilder extends
      // @@protoc_insertion_point(interface_extends:Controller)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <code>required uint32 id = 1;</code>
     * @return Whether the id field is set.
     */
    boolean hasId();
    /**
     * <code>required uint32 id = 1;</code>
     * @return The id.
     */
    int getId();

    /**
     * <code>required string name = 2;</code>
     * @return Whether the name field is set.
     */
    boolean hasName();
    /**
     * <code>required string name = 2;</code>
     * @return The name.
     */
    java.lang.String getName();
    /**
     * <code>required string name = 2;</code>
     * @return The bytes for name.
     */
    com.google.protobuf.ByteString
        getNameBytes();

    /**
     * <code>optional string model_name = 3;</code>
     * @return Whether the modelName field is set.
     */
    boolean hasModelName();
    /**
     * <code>optional string model_name = 3;</code>
     * @return The modelName.
     */
    java.lang.String getModelName();
    /**
     * <code>optional string model_name = 3;</code>
     * @return The bytes for modelName.
     */
    com.google.protobuf.ByteString
        getModelNameBytes();

    /**
     * <code>optional string serial_number = 4;</code>
     * @return Whether the serialNumber field is set.
     */
    boolean hasSerialNumber();
    /**
     * <code>optional string serial_number = 4;</code>
     * @return The serialNumber.
     */
    java.lang.String getSerialNumber();
    /**
     * <code>optional string serial_number = 4;</code>
     * @return The bytes for serialNumber.
     */
    com.google.protobuf.ByteString
        getSerialNumberBytes();
  }
  /**
   * <pre>
   * Describes a hardware controller
   * </pre>
   *
   * Protobuf type {@code Controller}
   */
  public static final class Controller extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:Controller)
      ControllerOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use Controller.newBuilder() to construct.
    private Controller(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private Controller() {
      name_ = "";
      modelName_ = "";
      serialNumber_ = "";
    }

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

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return org.kegbot.proto.Models.internal_static_Controller_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return org.kegbot.proto.Models.internal_static_Controller_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              org.kegbot.proto.Models.Controller.class, org.kegbot.proto.Models.Controller.Builder.class);
    }

    private int bitField0_;
    public static final int ID_FIELD_NUMBER = 1;
    private int id_;
    /**
     * <code>required uint32 id = 1;</code>
     * @return Whether the id field is set.
     */
    @java.lang.Override
    public boolean hasId() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <code>required uint32 id = 1;</code>
     * @return The id.
     */
    @java.lang.Override
    public int getId() {
      return id_;
    }

    public static final int NAME_FIELD_NUMBER = 2;
    private volatile java.lang.Object name_;
    /**
     * <code>required string name = 2;</code>
     * @return Whether the name field is set.
     */
    @java.lang.Override
    public boolean hasName() {
      return ((bitField0_ & 0x00000002) != 0);
    }
    /**
     * <code>required 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;
      }
    }
    /**
     * <code>required 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 MODEL_NAME_FIELD_NUMBER = 3;
    private volatile java.lang.Object modelName_;
    /**
     * <code>optional string model_name = 3;</code>
     * @return Whether the modelName field is set.
     */
    @java.lang.Override
    public boolean hasModelName() {
      return ((bitField0_ & 0x00000004) != 0);
    }
    /**
     * <code>optional string model_name = 3;</code>
     * @return The modelName.
     */
    @java.lang.Override
    public java.lang.String getModelName() {
      java.lang.Object ref = modelName_;
      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()) {
          modelName_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string model_name = 3;</code>
     * @return The bytes for modelName.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getModelNameBytes() {
      java.lang.Object ref = modelName_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        modelName_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int SERIAL_NUMBER_FIELD_NUMBER = 4;
    private volatile java.lang.Object serialNumber_;
    /**
     * <code>optional string serial_number = 4;</code>
     * @return Whether the serialNumber field is set.
     */
    @java.lang.Override
    public boolean hasSerialNumber() {
      return ((bitField0_ & 0x00000008) != 0);
    }
    /**
     * <code>optional string serial_number = 4;</code>
     * @return The serialNumber.
     */
    @java.lang.Override
    public java.lang.String getSerialNumber() {
      java.lang.Object ref = serialNumber_;
      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()) {
          serialNumber_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string serial_number = 4;</code>
     * @return The bytes for serialNumber.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getSerialNumberBytes() {
      java.lang.Object ref = serialNumber_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        serialNumber_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static org.kegbot.proto.Models.Controller parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.Controller parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.Controller parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.Controller parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.Controller parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.Controller parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.Controller parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.Controller 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 org.kegbot.proto.Models.Controller parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.Controller 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 org.kegbot.proto.Models.Controller parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.Controller 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(org.kegbot.proto.Models.Controller 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>
     * Describes a hardware controller
     * </pre>
     *
     * Protobuf type {@code Controller}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:Controller)
        org.kegbot.proto.Models.ControllerOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return org.kegbot.proto.Models.internal_static_Controller_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return org.kegbot.proto.Models.internal_static_Controller_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                org.kegbot.proto.Models.Controller.class, org.kegbot.proto.Models.Controller.Builder.class);
      }

      // Construct using org.kegbot.proto.Models.Controller.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);
        name_ = "";
        bitField0_ = (bitField0_ & ~0x00000002);
        modelName_ = "";
        bitField0_ = (bitField0_ & ~0x00000004);
        serialNumber_ = "";
        bitField0_ = (bitField0_ & ~0x00000008);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return org.kegbot.proto.Models.internal_static_Controller_descriptor;
      }

      @java.lang.Override
      public org.kegbot.proto.Models.Controller getDefaultInstanceForType() {
        return org.kegbot.proto.Models.Controller.getDefaultInstance();
      }

      @java.lang.Override
      public org.kegbot.proto.Models.Controller build() {
        org.kegbot.proto.Models.Controller result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public org.kegbot.proto.Models.Controller buildPartial() {
        org.kegbot.proto.Models.Controller result = new org.kegbot.proto.Models.Controller(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)) {
          to_bitField0_ |= 0x00000002;
        }
        result.name_ = name_;
        if (((from_bitField0_ & 0x00000004) != 0)) {
          to_bitField0_ |= 0x00000004;
        }
        result.modelName_ = modelName_;
        if (((from_bitField0_ & 0x00000008) != 0)) {
          to_bitField0_ |= 0x00000008;
        }
        result.serialNumber_ = serialNumber_;
        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);
      }
      private int bitField0_;

      private int id_ ;
      /**
       * <code>required uint32 id = 1;</code>
       * @return Whether the id field is set.
       */
      @java.lang.Override
      public boolean hasId() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <code>required uint32 id = 1;</code>
       * @return The id.
       */
      @java.lang.Override
      public int getId() {
        return id_;
      }
      /**
       * <code>required uint32 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;
      }
      /**
       * <code>required uint32 id = 1;</code>
       * @return This builder for chaining.
       */
      public Builder clearId() {
        bitField0_ = (bitField0_ & ~0x00000001);
        id_ = 0;
        onChanged();
        return this;
      }

      private java.lang.Object name_ = "";
      /**
       * <code>required string name = 2;</code>
       * @return Whether the name field is set.
       */
      public boolean hasName() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <code>required 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;
        }
      }
      /**
       * <code>required 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;
        }
      }
      /**
       * <code>required 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;
      }
      /**
       * <code>required string name = 2;</code>
       * @return This builder for chaining.
       */
      public Builder clearName() {
        bitField0_ = (bitField0_ & ~0x00000002);
        name_ = getDefaultInstance().getName();
        onChanged();
        return this;
      }
      /**
       * <code>required 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 modelName_ = "";
      /**
       * <code>optional string model_name = 3;</code>
       * @return Whether the modelName field is set.
       */
      public boolean hasModelName() {
        return ((bitField0_ & 0x00000004) != 0);
      }
      /**
       * <code>optional string model_name = 3;</code>
       * @return The modelName.
       */
      public java.lang.String getModelName() {
        java.lang.Object ref = modelName_;
        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()) {
            modelName_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string model_name = 3;</code>
       * @return The bytes for modelName.
       */
      public com.google.protobuf.ByteString
          getModelNameBytes() {
        java.lang.Object ref = modelName_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          modelName_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string model_name = 3;</code>
       * @param value The modelName to set.
       * @return This builder for chaining.
       */
      public Builder setModelName(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
        modelName_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string model_name = 3;</code>
       * @return This builder for chaining.
       */
      public Builder clearModelName() {
        bitField0_ = (bitField0_ & ~0x00000004);
        modelName_ = getDefaultInstance().getModelName();
        onChanged();
        return this;
      }
      /**
       * <code>optional string model_name = 3;</code>
       * @param value The bytes for modelName to set.
       * @return This builder for chaining.
       */
      public Builder setModelNameBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
        modelName_ = value;
        onChanged();
        return this;
      }

      private java.lang.Object serialNumber_ = "";
      /**
       * <code>optional string serial_number = 4;</code>
       * @return Whether the serialNumber field is set.
       */
      public boolean hasSerialNumber() {
        return ((bitField0_ & 0x00000008) != 0);
      }
      /**
       * <code>optional string serial_number = 4;</code>
       * @return The serialNumber.
       */
      public java.lang.String getSerialNumber() {
        java.lang.Object ref = serialNumber_;
        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()) {
            serialNumber_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string serial_number = 4;</code>
       * @return The bytes for serialNumber.
       */
      public com.google.protobuf.ByteString
          getSerialNumberBytes() {
        java.lang.Object ref = serialNumber_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          serialNumber_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string serial_number = 4;</code>
       * @param value The serialNumber to set.
       * @return This builder for chaining.
       */
      public Builder setSerialNumber(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
        serialNumber_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string serial_number = 4;</code>
       * @return This builder for chaining.
       */
      public Builder clearSerialNumber() {
        bitField0_ = (bitField0_ & ~0x00000008);
        serialNumber_ = getDefaultInstance().getSerialNumber();
        onChanged();
        return this;
      }
      /**
       * <code>optional string serial_number = 4;</code>
       * @param value The bytes for serialNumber to set.
       * @return This builder for chaining.
       */
      public Builder setSerialNumberBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
        serialNumber_ = 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:Controller)
    }

    // @@protoc_insertion_point(class_scope:Controller)
    private static final org.kegbot.proto.Models.Controller DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new org.kegbot.proto.Models.Controller();
    }

    public static org.kegbot.proto.Models.Controller getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

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

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

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

    @java.lang.Override
    public org.kegbot.proto.Models.Controller getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface FlowMeterOrBuilder extends
      // @@protoc_insertion_point(interface_extends:FlowMeter)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <code>required uint32 id = 1;</code>
     * @return Whether the id field is set.
     */
    boolean hasId();
    /**
     * <code>required uint32 id = 1;</code>
     * @return The id.
     */
    int getId();

    /**
     * <code>required string name = 2;</code>
     * @return Whether the name field is set.
     */
    boolean hasName();
    /**
     * <code>required string name = 2;</code>
     * @return The name.
     */
    java.lang.String getName();
    /**
     * <code>required string name = 2;</code>
     * @return The bytes for name.
     */
    com.google.protobuf.ByteString
        getNameBytes();

    /**
     * <code>required string port_name = 3;</code>
     * @return Whether the portName field is set.
     */
    boolean hasPortName();
    /**
     * <code>required string port_name = 3;</code>
     * @return The portName.
     */
    java.lang.String getPortName();
    /**
     * <code>required string port_name = 3;</code>
     * @return The bytes for portName.
     */
    com.google.protobuf.ByteString
        getPortNameBytes();

    /**
     * <code>required double ticks_per_ml = 4;</code>
     * @return Whether the ticksPerMl field is set.
     */
    boolean hasTicksPerMl();
    /**
     * <code>required double ticks_per_ml = 4;</code>
     * @return The ticksPerMl.
     */
    double getTicksPerMl();

    /**
     * <code>optional .Controller controller = 5;</code>
     * @return Whether the controller field is set.
     */
    boolean hasController();
    /**
     * <code>optional .Controller controller = 5;</code>
     * @return The controller.
     */
    org.kegbot.proto.Models.Controller getController();
    /**
     * <code>optional .Controller controller = 5;</code>
     */
    org.kegbot.proto.Models.ControllerOrBuilder getControllerOrBuilder();
  }
  /**
   * Protobuf type {@code FlowMeter}
   */
  public static final class FlowMeter extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:FlowMeter)
      FlowMeterOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use FlowMeter.newBuilder() to construct.
    private FlowMeter(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private FlowMeter() {
      name_ = "";
      portName_ = "";
    }

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

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return org.kegbot.proto.Models.internal_static_FlowMeter_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return org.kegbot.proto.Models.internal_static_FlowMeter_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              org.kegbot.proto.Models.FlowMeter.class, org.kegbot.proto.Models.FlowMeter.Builder.class);
    }

    private int bitField0_;
    public static final int ID_FIELD_NUMBER = 1;
    private int id_;
    /**
     * <code>required uint32 id = 1;</code>
     * @return Whether the id field is set.
     */
    @java.lang.Override
    public boolean hasId() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <code>required uint32 id = 1;</code>
     * @return The id.
     */
    @java.lang.Override
    public int getId() {
      return id_;
    }

    public static final int NAME_FIELD_NUMBER = 2;
    private volatile java.lang.Object name_;
    /**
     * <code>required string name = 2;</code>
     * @return Whether the name field is set.
     */
    @java.lang.Override
    public boolean hasName() {
      return ((bitField0_ & 0x00000002) != 0);
    }
    /**
     * <code>required 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;
      }
    }
    /**
     * <code>required 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 PORT_NAME_FIELD_NUMBER = 3;
    private volatile java.lang.Object portName_;
    /**
     * <code>required string port_name = 3;</code>
     * @return Whether the portName field is set.
     */
    @java.lang.Override
    public boolean hasPortName() {
      return ((bitField0_ & 0x00000004) != 0);
    }
    /**
     * <code>required string port_name = 3;</code>
     * @return The portName.
     */
    @java.lang.Override
    public java.lang.String getPortName() {
      java.lang.Object ref = portName_;
      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()) {
          portName_ = s;
        }
        return s;
      }
    }
    /**
     * <code>required string port_name = 3;</code>
     * @return The bytes for portName.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getPortNameBytes() {
      java.lang.Object ref = portName_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        portName_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int TICKS_PER_ML_FIELD_NUMBER = 4;
    private double ticksPerMl_;
    /**
     * <code>required double ticks_per_ml = 4;</code>
     * @return Whether the ticksPerMl field is set.
     */
    @java.lang.Override
    public boolean hasTicksPerMl() {
      return ((bitField0_ & 0x00000008) != 0);
    }
    /**
     * <code>required double ticks_per_ml = 4;</code>
     * @return The ticksPerMl.
     */
    @java.lang.Override
    public double getTicksPerMl() {
      return ticksPerMl_;
    }

    public static final int CONTROLLER_FIELD_NUMBER = 5;
    private org.kegbot.proto.Models.Controller controller_;
    /**
     * <code>optional .Controller controller = 5;</code>
     * @return Whether the controller field is set.
     */
    @java.lang.Override
    public boolean hasController() {
      return ((bitField0_ & 0x00000010) != 0);
    }
    /**
     * <code>optional .Controller controller = 5;</code>
     * @return The controller.
     */
    @java.lang.Override
    public org.kegbot.proto.Models.Controller getController() {
      return controller_ == null ? org.kegbot.proto.Models.Controller.getDefaultInstance() : controller_;
    }
    /**
     * <code>optional .Controller controller = 5;</code>
     */
    @java.lang.Override
    public org.kegbot.proto.Models.ControllerOrBuilder getControllerOrBuilder() {
      return controller_ == null ? org.kegbot.proto.Models.Controller.getDefaultInstance() : controller_;
    }

    public static org.kegbot.proto.Models.FlowMeter parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.FlowMeter parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.FlowMeter parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.FlowMeter parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.FlowMeter parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.FlowMeter parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.FlowMeter parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.FlowMeter 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 org.kegbot.proto.Models.FlowMeter parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.FlowMeter 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 org.kegbot.proto.Models.FlowMeter parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.FlowMeter 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(org.kegbot.proto.Models.FlowMeter 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 FlowMeter}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:FlowMeter)
        org.kegbot.proto.Models.FlowMeterOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return org.kegbot.proto.Models.internal_static_FlowMeter_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return org.kegbot.proto.Models.internal_static_FlowMeter_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                org.kegbot.proto.Models.FlowMeter.class, org.kegbot.proto.Models.FlowMeter.Builder.class);
      }

      // Construct using org.kegbot.proto.Models.FlowMeter.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
          getControllerFieldBuilder();
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        id_ = 0;
        bitField0_ = (bitField0_ & ~0x00000001);
        name_ = "";
        bitField0_ = (bitField0_ & ~0x00000002);
        portName_ = "";
        bitField0_ = (bitField0_ & ~0x00000004);
        ticksPerMl_ = 0D;
        bitField0_ = (bitField0_ & ~0x00000008);
        if (controllerBuilder_ == null) {
          controller_ = null;
        } else {
          controllerBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000010);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return org.kegbot.proto.Models.internal_static_FlowMeter_descriptor;
      }

      @java.lang.Override
      public org.kegbot.proto.Models.FlowMeter getDefaultInstanceForType() {
        return org.kegbot.proto.Models.FlowMeter.getDefaultInstance();
      }

      @java.lang.Override
      public org.kegbot.proto.Models.FlowMeter build() {
        org.kegbot.proto.Models.FlowMeter result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public org.kegbot.proto.Models.FlowMeter buildPartial() {
        org.kegbot.proto.Models.FlowMeter result = new org.kegbot.proto.Models.FlowMeter(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)) {
          to_bitField0_ |= 0x00000002;
        }
        result.name_ = name_;
        if (((from_bitField0_ & 0x00000004) != 0)) {
          to_bitField0_ |= 0x00000004;
        }
        result.portName_ = portName_;
        if (((from_bitField0_ & 0x00000008) != 0)) {
          result.ticksPerMl_ = ticksPerMl_;
          to_bitField0_ |= 0x00000008;
        }
        if (((from_bitField0_ & 0x00000010) != 0)) {
          if (controllerBuilder_ == null) {
            result.controller_ = controller_;
          } else {
            result.controller_ = controllerBuilder_.build();
          }
          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);
      }
      private int bitField0_;

      private int id_ ;
      /**
       * <code>required uint32 id = 1;</code>
       * @return Whether the id field is set.
       */
      @java.lang.Override
      public boolean hasId() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <code>required uint32 id = 1;</code>
       * @return The id.
       */
      @java.lang.Override
      public int getId() {
        return id_;
      }
      /**
       * <code>required uint32 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;
      }
      /**
       * <code>required uint32 id = 1;</code>
       * @return This builder for chaining.
       */
      public Builder clearId() {
        bitField0_ = (bitField0_ & ~0x00000001);
        id_ = 0;
        onChanged();
        return this;
      }

      private java.lang.Object name_ = "";
      /**
       * <code>required string name = 2;</code>
       * @return Whether the name field is set.
       */
      public boolean hasName() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <code>required 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;
        }
      }
      /**
       * <code>required 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;
        }
      }
      /**
       * <code>required 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;
      }
      /**
       * <code>required string name = 2;</code>
       * @return This builder for chaining.
       */
      public Builder clearName() {
        bitField0_ = (bitField0_ & ~0x00000002);
        name_ = getDefaultInstance().getName();
        onChanged();
        return this;
      }
      /**
       * <code>required 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 portName_ = "";
      /**
       * <code>required string port_name = 3;</code>
       * @return Whether the portName field is set.
       */
      public boolean hasPortName() {
        return ((bitField0_ & 0x00000004) != 0);
      }
      /**
       * <code>required string port_name = 3;</code>
       * @return The portName.
       */
      public java.lang.String getPortName() {
        java.lang.Object ref = portName_;
        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()) {
            portName_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>required string port_name = 3;</code>
       * @return The bytes for portName.
       */
      public com.google.protobuf.ByteString
          getPortNameBytes() {
        java.lang.Object ref = portName_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          portName_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>required string port_name = 3;</code>
       * @param value The portName to set.
       * @return This builder for chaining.
       */
      public Builder setPortName(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
        portName_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>required string port_name = 3;</code>
       * @return This builder for chaining.
       */
      public Builder clearPortName() {
        bitField0_ = (bitField0_ & ~0x00000004);
        portName_ = getDefaultInstance().getPortName();
        onChanged();
        return this;
      }
      /**
       * <code>required string port_name = 3;</code>
       * @param value The bytes for portName to set.
       * @return This builder for chaining.
       */
      public Builder setPortNameBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
        portName_ = value;
        onChanged();
        return this;
      }

      private double ticksPerMl_ ;
      /**
       * <code>required double ticks_per_ml = 4;</code>
       * @return Whether the ticksPerMl field is set.
       */
      @java.lang.Override
      public boolean hasTicksPerMl() {
        return ((bitField0_ & 0x00000008) != 0);
      }
      /**
       * <code>required double ticks_per_ml = 4;</code>
       * @return The ticksPerMl.
       */
      @java.lang.Override
      public double getTicksPerMl() {
        return ticksPerMl_;
      }
      /**
       * <code>required double ticks_per_ml = 4;</code>
       * @param value The ticksPerMl to set.
       * @return This builder for chaining.
       */
      public Builder setTicksPerMl(double value) {
        bitField0_ |= 0x00000008;
        ticksPerMl_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>required double ticks_per_ml = 4;</code>
       * @return This builder for chaining.
       */
      public Builder clearTicksPerMl() {
        bitField0_ = (bitField0_ & ~0x00000008);
        ticksPerMl_ = 0D;
        onChanged();
        return this;
      }

      private org.kegbot.proto.Models.Controller controller_;
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.Controller, org.kegbot.proto.Models.Controller.Builder, org.kegbot.proto.Models.ControllerOrBuilder> controllerBuilder_;
      /**
       * <code>optional .Controller controller = 5;</code>
       * @return Whether the controller field is set.
       */
      public boolean hasController() {
        return ((bitField0_ & 0x00000010) != 0);
      }
      /**
       * <code>optional .Controller controller = 5;</code>
       * @return The controller.
       */
      public org.kegbot.proto.Models.Controller getController() {
        if (controllerBuilder_ == null) {
          return controller_ == null ? org.kegbot.proto.Models.Controller.getDefaultInstance() : controller_;
        } else {
          return controllerBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .Controller controller = 5;</code>
       */
      public Builder setController(org.kegbot.proto.Models.Controller value) {
        if (controllerBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          controller_ = value;
          onChanged();
        } else {
          controllerBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000010;
        return this;
      }
      /**
       * <code>optional .Controller controller = 5;</code>
       */
      public Builder setController(
          org.kegbot.proto.Models.Controller.Builder builderForValue) {
        if (controllerBuilder_ == null) {
          controller_ = builderForValue.build();
          onChanged();
        } else {
          controllerBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000010;
        return this;
      }
      /**
       * <code>optional .Controller controller = 5;</code>
       */
      public Builder mergeController(org.kegbot.proto.Models.Controller value) {
        if (controllerBuilder_ == null) {
          if (((bitField0_ & 0x00000010) != 0) &&
              controller_ != null &&
              controller_ != org.kegbot.proto.Models.Controller.getDefaultInstance()) {
            controller_ =
              org.kegbot.proto.Models.Controller.newBuilder(controller_).mergeFrom(value).buildPartial();
          } else {
            controller_ = value;
          }
          onChanged();
        } else {
          controllerBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000010;
        return this;
      }
      /**
       * <code>optional .Controller controller = 5;</code>
       */
      public Builder clearController() {
        if (controllerBuilder_ == null) {
          controller_ = null;
          onChanged();
        } else {
          controllerBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000010);
        return this;
      }
      /**
       * <code>optional .Controller controller = 5;</code>
       */
      public org.kegbot.proto.Models.Controller.Builder getControllerBuilder() {
        bitField0_ |= 0x00000010;
        onChanged();
        return getControllerFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .Controller controller = 5;</code>
       */
      public org.kegbot.proto.Models.ControllerOrBuilder getControllerOrBuilder() {
        if (controllerBuilder_ != null) {
          return controllerBuilder_.getMessageOrBuilder();
        } else {
          return controller_ == null ?
              org.kegbot.proto.Models.Controller.getDefaultInstance() : controller_;
        }
      }
      /**
       * <code>optional .Controller controller = 5;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.Controller, org.kegbot.proto.Models.Controller.Builder, org.kegbot.proto.Models.ControllerOrBuilder> 
          getControllerFieldBuilder() {
        if (controllerBuilder_ == null) {
          controllerBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              org.kegbot.proto.Models.Controller, org.kegbot.proto.Models.Controller.Builder, org.kegbot.proto.Models.ControllerOrBuilder>(
                  getController(),
                  getParentForChildren(),
                  isClean());
          controller_ = null;
        }
        return controllerBuilder_;
      }
      @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:FlowMeter)
    }

    // @@protoc_insertion_point(class_scope:FlowMeter)
    private static final org.kegbot.proto.Models.FlowMeter DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new org.kegbot.proto.Models.FlowMeter();
    }

    public static org.kegbot.proto.Models.FlowMeter getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

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

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

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

    @java.lang.Override
    public org.kegbot.proto.Models.FlowMeter getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface FlowToggleOrBuilder extends
      // @@protoc_insertion_point(interface_extends:FlowToggle)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <code>required uint32 id = 1;</code>
     * @return Whether the id field is set.
     */
    boolean hasId();
    /**
     * <code>required uint32 id = 1;</code>
     * @return The id.
     */
    int getId();

    /**
     * <code>required string name = 2;</code>
     * @return Whether the name field is set.
     */
    boolean hasName();
    /**
     * <code>required string name = 2;</code>
     * @return The name.
     */
    java.lang.String getName();
    /**
     * <code>required string name = 2;</code>
     * @return The bytes for name.
     */
    com.google.protobuf.ByteString
        getNameBytes();

    /**
     * <code>required string port_name = 3;</code>
     * @return Whether the portName field is set.
     */
    boolean hasPortName();
    /**
     * <code>required string port_name = 3;</code>
     * @return The portName.
     */
    java.lang.String getPortName();
    /**
     * <code>required string port_name = 3;</code>
     * @return The bytes for portName.
     */
    com.google.protobuf.ByteString
        getPortNameBytes();

    /**
     * <code>optional .Controller controller = 4;</code>
     * @return Whether the controller field is set.
     */
    boolean hasController();
    /**
     * <code>optional .Controller controller = 4;</code>
     * @return The controller.
     */
    org.kegbot.proto.Models.Controller getController();
    /**
     * <code>optional .Controller controller = 4;</code>
     */
    org.kegbot.proto.Models.ControllerOrBuilder getControllerOrBuilder();
  }
  /**
   * Protobuf type {@code FlowToggle}
   */
  public static final class FlowToggle extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:FlowToggle)
      FlowToggleOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use FlowToggle.newBuilder() to construct.
    private FlowToggle(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private FlowToggle() {
      name_ = "";
      portName_ = "";
    }

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

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return org.kegbot.proto.Models.internal_static_FlowToggle_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return org.kegbot.proto.Models.internal_static_FlowToggle_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              org.kegbot.proto.Models.FlowToggle.class, org.kegbot.proto.Models.FlowToggle.Builder.class);
    }

    private int bitField0_;
    public static final int ID_FIELD_NUMBER = 1;
    private int id_;
    /**
     * <code>required uint32 id = 1;</code>
     * @return Whether the id field is set.
     */
    @java.lang.Override
    public boolean hasId() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <code>required uint32 id = 1;</code>
     * @return The id.
     */
    @java.lang.Override
    public int getId() {
      return id_;
    }

    public static final int NAME_FIELD_NUMBER = 2;
    private volatile java.lang.Object name_;
    /**
     * <code>required string name = 2;</code>
     * @return Whether the name field is set.
     */
    @java.lang.Override
    public boolean hasName() {
      return ((bitField0_ & 0x00000002) != 0);
    }
    /**
     * <code>required 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;
      }
    }
    /**
     * <code>required 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 PORT_NAME_FIELD_NUMBER = 3;
    private volatile java.lang.Object portName_;
    /**
     * <code>required string port_name = 3;</code>
     * @return Whether the portName field is set.
     */
    @java.lang.Override
    public boolean hasPortName() {
      return ((bitField0_ & 0x00000004) != 0);
    }
    /**
     * <code>required string port_name = 3;</code>
     * @return The portName.
     */
    @java.lang.Override
    public java.lang.String getPortName() {
      java.lang.Object ref = portName_;
      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()) {
          portName_ = s;
        }
        return s;
      }
    }
    /**
     * <code>required string port_name = 3;</code>
     * @return The bytes for portName.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getPortNameBytes() {
      java.lang.Object ref = portName_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        portName_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int CONTROLLER_FIELD_NUMBER = 4;
    private org.kegbot.proto.Models.Controller controller_;
    /**
     * <code>optional .Controller controller = 4;</code>
     * @return Whether the controller field is set.
     */
    @java.lang.Override
    public boolean hasController() {
      return ((bitField0_ & 0x00000008) != 0);
    }
    /**
     * <code>optional .Controller controller = 4;</code>
     * @return The controller.
     */
    @java.lang.Override
    public org.kegbot.proto.Models.Controller getController() {
      return controller_ == null ? org.kegbot.proto.Models.Controller.getDefaultInstance() : controller_;
    }
    /**
     * <code>optional .Controller controller = 4;</code>
     */
    @java.lang.Override
    public org.kegbot.proto.Models.ControllerOrBuilder getControllerOrBuilder() {
      return controller_ == null ? org.kegbot.proto.Models.Controller.getDefaultInstance() : controller_;
    }

    public static org.kegbot.proto.Models.FlowToggle parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.FlowToggle parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.FlowToggle parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.FlowToggle parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.FlowToggle parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.FlowToggle parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.FlowToggle parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.FlowToggle 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 org.kegbot.proto.Models.FlowToggle parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.FlowToggle 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 org.kegbot.proto.Models.FlowToggle parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.FlowToggle 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(org.kegbot.proto.Models.FlowToggle 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 FlowToggle}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:FlowToggle)
        org.kegbot.proto.Models.FlowToggleOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return org.kegbot.proto.Models.internal_static_FlowToggle_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return org.kegbot.proto.Models.internal_static_FlowToggle_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                org.kegbot.proto.Models.FlowToggle.class, org.kegbot.proto.Models.FlowToggle.Builder.class);
      }

      // Construct using org.kegbot.proto.Models.FlowToggle.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
          getControllerFieldBuilder();
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        id_ = 0;
        bitField0_ = (bitField0_ & ~0x00000001);
        name_ = "";
        bitField0_ = (bitField0_ & ~0x00000002);
        portName_ = "";
        bitField0_ = (bitField0_ & ~0x00000004);
        if (controllerBuilder_ == null) {
          controller_ = null;
        } else {
          controllerBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000008);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return org.kegbot.proto.Models.internal_static_FlowToggle_descriptor;
      }

      @java.lang.Override
      public org.kegbot.proto.Models.FlowToggle getDefaultInstanceForType() {
        return org.kegbot.proto.Models.FlowToggle.getDefaultInstance();
      }

      @java.lang.Override
      public org.kegbot.proto.Models.FlowToggle build() {
        org.kegbot.proto.Models.FlowToggle result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public org.kegbot.proto.Models.FlowToggle buildPartial() {
        org.kegbot.proto.Models.FlowToggle result = new org.kegbot.proto.Models.FlowToggle(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)) {
          to_bitField0_ |= 0x00000002;
        }
        result.name_ = name_;
        if (((from_bitField0_ & 0x00000004) != 0)) {
          to_bitField0_ |= 0x00000004;
        }
        result.portName_ = portName_;
        if (((from_bitField0_ & 0x00000008) != 0)) {
          if (controllerBuilder_ == null) {
            result.controller_ = controller_;
          } else {
            result.controller_ = controllerBuilder_.build();
          }
          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);
      }
      private int bitField0_;

      private int id_ ;
      /**
       * <code>required uint32 id = 1;</code>
       * @return Whether the id field is set.
       */
      @java.lang.Override
      public boolean hasId() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <code>required uint32 id = 1;</code>
       * @return The id.
       */
      @java.lang.Override
      public int getId() {
        return id_;
      }
      /**
       * <code>required uint32 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;
      }
      /**
       * <code>required uint32 id = 1;</code>
       * @return This builder for chaining.
       */
      public Builder clearId() {
        bitField0_ = (bitField0_ & ~0x00000001);
        id_ = 0;
        onChanged();
        return this;
      }

      private java.lang.Object name_ = "";
      /**
       * <code>required string name = 2;</code>
       * @return Whether the name field is set.
       */
      public boolean hasName() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <code>required 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;
        }
      }
      /**
       * <code>required 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;
        }
      }
      /**
       * <code>required 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;
      }
      /**
       * <code>required string name = 2;</code>
       * @return This builder for chaining.
       */
      public Builder clearName() {
        bitField0_ = (bitField0_ & ~0x00000002);
        name_ = getDefaultInstance().getName();
        onChanged();
        return this;
      }
      /**
       * <code>required 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 portName_ = "";
      /**
       * <code>required string port_name = 3;</code>
       * @return Whether the portName field is set.
       */
      public boolean hasPortName() {
        return ((bitField0_ & 0x00000004) != 0);
      }
      /**
       * <code>required string port_name = 3;</code>
       * @return The portName.
       */
      public java.lang.String getPortName() {
        java.lang.Object ref = portName_;
        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()) {
            portName_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>required string port_name = 3;</code>
       * @return The bytes for portName.
       */
      public com.google.protobuf.ByteString
          getPortNameBytes() {
        java.lang.Object ref = portName_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          portName_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>required string port_name = 3;</code>
       * @param value The portName to set.
       * @return This builder for chaining.
       */
      public Builder setPortName(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
        portName_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>required string port_name = 3;</code>
       * @return This builder for chaining.
       */
      public Builder clearPortName() {
        bitField0_ = (bitField0_ & ~0x00000004);
        portName_ = getDefaultInstance().getPortName();
        onChanged();
        return this;
      }
      /**
       * <code>required string port_name = 3;</code>
       * @param value The bytes for portName to set.
       * @return This builder for chaining.
       */
      public Builder setPortNameBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
        portName_ = value;
        onChanged();
        return this;
      }

      private org.kegbot.proto.Models.Controller controller_;
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.Controller, org.kegbot.proto.Models.Controller.Builder, org.kegbot.proto.Models.ControllerOrBuilder> controllerBuilder_;
      /**
       * <code>optional .Controller controller = 4;</code>
       * @return Whether the controller field is set.
       */
      public boolean hasController() {
        return ((bitField0_ & 0x00000008) != 0);
      }
      /**
       * <code>optional .Controller controller = 4;</code>
       * @return The controller.
       */
      public org.kegbot.proto.Models.Controller getController() {
        if (controllerBuilder_ == null) {
          return controller_ == null ? org.kegbot.proto.Models.Controller.getDefaultInstance() : controller_;
        } else {
          return controllerBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .Controller controller = 4;</code>
       */
      public Builder setController(org.kegbot.proto.Models.Controller value) {
        if (controllerBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          controller_ = value;
          onChanged();
        } else {
          controllerBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000008;
        return this;
      }
      /**
       * <code>optional .Controller controller = 4;</code>
       */
      public Builder setController(
          org.kegbot.proto.Models.Controller.Builder builderForValue) {
        if (controllerBuilder_ == null) {
          controller_ = builderForValue.build();
          onChanged();
        } else {
          controllerBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000008;
        return this;
      }
      /**
       * <code>optional .Controller controller = 4;</code>
       */
      public Builder mergeController(org.kegbot.proto.Models.Controller value) {
        if (controllerBuilder_ == null) {
          if (((bitField0_ & 0x00000008) != 0) &&
              controller_ != null &&
              controller_ != org.kegbot.proto.Models.Controller.getDefaultInstance()) {
            controller_ =
              org.kegbot.proto.Models.Controller.newBuilder(controller_).mergeFrom(value).buildPartial();
          } else {
            controller_ = value;
          }
          onChanged();
        } else {
          controllerBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000008;
        return this;
      }
      /**
       * <code>optional .Controller controller = 4;</code>
       */
      public Builder clearController() {
        if (controllerBuilder_ == null) {
          controller_ = null;
          onChanged();
        } else {
          controllerBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000008);
        return this;
      }
      /**
       * <code>optional .Controller controller = 4;</code>
       */
      public org.kegbot.proto.Models.Controller.Builder getControllerBuilder() {
        bitField0_ |= 0x00000008;
        onChanged();
        return getControllerFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .Controller controller = 4;</code>
       */
      public org.kegbot.proto.Models.ControllerOrBuilder getControllerOrBuilder() {
        if (controllerBuilder_ != null) {
          return controllerBuilder_.getMessageOrBuilder();
        } else {
          return controller_ == null ?
              org.kegbot.proto.Models.Controller.getDefaultInstance() : controller_;
        }
      }
      /**
       * <code>optional .Controller controller = 4;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.Controller, org.kegbot.proto.Models.Controller.Builder, org.kegbot.proto.Models.ControllerOrBuilder> 
          getControllerFieldBuilder() {
        if (controllerBuilder_ == null) {
          controllerBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              org.kegbot.proto.Models.Controller, org.kegbot.proto.Models.Controller.Builder, org.kegbot.proto.Models.ControllerOrBuilder>(
                  getController(),
                  getParentForChildren(),
                  isClean());
          controller_ = null;
        }
        return controllerBuilder_;
      }
      @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:FlowToggle)
    }

    // @@protoc_insertion_point(class_scope:FlowToggle)
    private static final org.kegbot.proto.Models.FlowToggle DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new org.kegbot.proto.Models.FlowToggle();
    }

    public static org.kegbot.proto.Models.FlowToggle getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

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

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

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

    @java.lang.Override
    public org.kegbot.proto.Models.FlowToggle getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface KegTapOrBuilder extends
      // @@protoc_insertion_point(interface_extends:KegTap)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <pre>
     * The unique identifier for this tap.
     * </pre>
     *
     * <code>required uint32 id = 1;</code>
     * @return Whether the id field is set.
     */
    boolean hasId();
    /**
     * <pre>
     * The unique identifier for this tap.
     * </pre>
     *
     * <code>required uint32 id = 1;</code>
     * @return The id.
     */
    int getId();

    /**
     * <pre>
     * The name of the tap, a free-form string ("Main tap", "Wet bar", ...)
     * </pre>
     *
     * <code>required string name = 2;</code>
     * @return Whether the name field is set.
     */
    boolean hasName();
    /**
     * <pre>
     * The name of the tap, a free-form string ("Main tap", "Wet bar", ...)
     * </pre>
     *
     * <code>required string name = 2;</code>
     * @return The name.
     */
    java.lang.String getName();
    /**
     * <pre>
     * The name of the tap, a free-form string ("Main tap", "Wet bar", ...)
     * </pre>
     *
     * <code>required string name = 2;</code>
     * @return The bytes for name.
     */
    com.google.protobuf.ByteString
        getNameBytes();

    /**
     * <pre>
     * The name of the flow meter assigned to this tap.
     * Deprecated in favor of 'meter'
     * </pre>
     *
     * <code>optional string meter_name = 3 [deprecated = true];</code>
     * @deprecated
     * @return Whether the meterName field is set.
     */
    @java.lang.Deprecated boolean hasMeterName();
    /**
     * <pre>
     * The name of the flow meter assigned to this tap.
     * Deprecated in favor of 'meter'
     * </pre>
     *
     * <code>optional string meter_name = 3 [deprecated = true];</code>
     * @deprecated
     * @return The meterName.
     */
    @java.lang.Deprecated java.lang.String getMeterName();
    /**
     * <pre>
     * The name of the flow meter assigned to this tap.
     * Deprecated in favor of 'meter'
     * </pre>
     *
     * <code>optional string meter_name = 3 [deprecated = true];</code>
     * @deprecated
     * @return The bytes for meterName.
     */
    @java.lang.Deprecated com.google.protobuf.ByteString
        getMeterNameBytes();

    /**
     * <pre>
     * The currently-connected meter, if any.
     * </pre>
     *
     * <code>optional .FlowMeter meter = 12;</code>
     * @return Whether the meter field is set.
     */
    boolean hasMeter();
    /**
     * <pre>
     * The currently-connected meter, if any.
     * </pre>
     *
     * <code>optional .FlowMeter meter = 12;</code>
     * @return The meter.
     */
    org.kegbot.proto.Models.FlowMeter getMeter();
    /**
     * <pre>
     * The currently-connected meter, if any.
     * </pre>
     *
     * <code>optional .FlowMeter meter = 12;</code>
     */
    org.kegbot.proto.Models.FlowMeterOrBuilder getMeterOrBuilder();

    /**
     * <pre>
     * The currently-connected toggle, if any.
     * </pre>
     *
     * <code>optional .FlowToggle toggle = 13;</code>
     * @return Whether the toggle field is set.
     */
    boolean hasToggle();
    /**
     * <pre>
     * The currently-connected toggle, if any.
     * </pre>
     *
     * <code>optional .FlowToggle toggle = 13;</code>
     * @return The toggle.
     */
    org.kegbot.proto.Models.FlowToggle getToggle();
    /**
     * <pre>
     * The currently-connected toggle, if any.
     * </pre>
     *
     * <code>optional .FlowToggle toggle = 13;</code>
     */
    org.kegbot.proto.Models.FlowToggleOrBuilder getToggleOrBuilder();

    /**
     * <pre>
     * The currently-connected temperature sensor, if any.
     * </pre>
     *
     * <code>optional .ThermoSensor thermo_sensor = 14;</code>
     * @return Whether the thermoSensor field is set.
     */
    boolean hasThermoSensor();
    /**
     * <pre>
     * The currently-connected temperature sensor, if any.
     * </pre>
     *
     * <code>optional .ThermoSensor thermo_sensor = 14;</code>
     * @return The thermoSensor.
     */
    org.kegbot.proto.Models.ThermoSensor getThermoSensor();
    /**
     * <pre>
     * The currently-connected temperature sensor, if any.
     * </pre>
     *
     * <code>optional .ThermoSensor thermo_sensor = 14;</code>
     */
    org.kegbot.proto.Models.ThermoSensorOrBuilder getThermoSensorOrBuilder();

    /**
     * <pre>
     * The relay name of the tap.
     * </pre>
     *
     * <code>optional string relay_name = 4;</code>
     * @return Whether the relayName field is set.
     */
    boolean hasRelayName();
    /**
     * <pre>
     * The relay name of the tap.
     * </pre>
     *
     * <code>optional string relay_name = 4;</code>
     * @return The relayName.
     */
    java.lang.String getRelayName();
    /**
     * <pre>
     * The relay name of the tap.
     * </pre>
     *
     * <code>optional string relay_name = 4;</code>
     * @return The bytes for relayName.
     */
    com.google.protobuf.ByteString
        getRelayNameBytes();

    /**
     * <pre>
     * Size of each flowmeter tick, in milliliters.
     * </pre>
     *
     * <code>optional double ml_per_tick = 5;</code>
     * @return Whether the mlPerTick field is set.
     */
    boolean hasMlPerTick();
    /**
     * <pre>
     * Size of each flowmeter tick, in milliliters.
     * </pre>
     *
     * <code>optional double ml_per_tick = 5;</code>
     * @return The mlPerTick.
     */
    double getMlPerTick();

    /**
     * <pre>
     * A longer description of the tap.
     * </pre>
     *
     * <code>optional string description = 6;</code>
     * @return Whether the description field is set.
     */
    boolean hasDescription();
    /**
     * <pre>
     * A longer description of the tap.
     * </pre>
     *
     * <code>optional string description = 6;</code>
     * @return The description.
     */
    java.lang.String getDescription();
    /**
     * <pre>
     * A longer description of the tap.
     * </pre>
     *
     * <code>optional string description = 6;</code>
     * @return The bytes for description.
     */
    com.google.protobuf.ByteString
        getDescriptionBytes();

    /**
     * <pre>
     * The temperature sensor for the tap, if any.
     * </pre>
     *
     * <code>optional uint32 thermo_sensor_id = 8;</code>
     * @return Whether the thermoSensorId field is set.
     */
    boolean hasThermoSensorId();
    /**
     * <pre>
     * The temperature sensor for the tap, if any.
     * </pre>
     *
     * <code>optional uint32 thermo_sensor_id = 8;</code>
     * @return The thermoSensorId.
     */
    int getThermoSensorId();

    /**
     * <pre>
     * The last temperature log, if any.
     * </pre>
     *
     * <code>optional .ThermoLog last_temperature = 9;</code>
     * @return Whether the lastTemperature field is set.
     */
    boolean hasLastTemperature();
    /**
     * <pre>
     * The last temperature log, if any.
     * </pre>
     *
     * <code>optional .ThermoLog last_temperature = 9;</code>
     * @return The lastTemperature.
     */
    org.kegbot.proto.Models.ThermoLog getLastTemperature();
    /**
     * <pre>
     * The last temperature log, if any.
     * </pre>
     *
     * <code>optional .ThermoLog last_temperature = 9;</code>
     */
    org.kegbot.proto.Models.ThermoLogOrBuilder getLastTemperatureOrBuilder();

    /**
     * <pre>
     * The Keg currently assigned to the tap.  May be unset if there is no keg
     * configured.
     * </pre>
     *
     * <code>optional uint32 current_keg_id = 10;</code>
     * @return Whether the currentKegId field is set.
     */
    boolean hasCurrentKegId();
    /**
     * <pre>
     * The Keg currently assigned to the tap.  May be unset if there is no keg
     * configured.
     * </pre>
     *
     * <code>optional uint32 current_keg_id = 10;</code>
     * @return The currentKegId.
     */
    int getCurrentKegId();

    /**
     * <code>optional .Keg current_keg = 11;</code>
     * @return Whether the currentKeg field is set.
     */
    boolean hasCurrentKeg();
    /**
     * <code>optional .Keg current_keg = 11;</code>
     * @return The currentKeg.
     */
    org.kegbot.proto.Models.Keg getCurrentKeg();
    /**
     * <code>optional .Keg current_keg = 11;</code>
     */
    org.kegbot.proto.Models.KegOrBuilder getCurrentKegOrBuilder();

    /**
     * <code>optional uint32 sort_order = 15 [default = 0];</code>
     * @return Whether the sortOrder field is set.
     */
    boolean hasSortOrder();
    /**
     * <code>optional uint32 sort_order = 15 [default = 0];</code>
     * @return The sortOrder.
     */
    int getSortOrder();
  }
  /**
   * <pre>
   * Describes a tap which is available for pouring beer.
   * </pre>
   *
   * Protobuf type {@code KegTap}
   */
  public static final class KegTap extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:KegTap)
      KegTapOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use KegTap.newBuilder() to construct.
    private KegTap(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private KegTap() {
      name_ = "";
      meterName_ = "";
      relayName_ = "";
      description_ = "";
    }

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

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return org.kegbot.proto.Models.internal_static_KegTap_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return org.kegbot.proto.Models.internal_static_KegTap_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              org.kegbot.proto.Models.KegTap.class, org.kegbot.proto.Models.KegTap.Builder.class);
    }

    private int bitField0_;
    public static final int ID_FIELD_NUMBER = 1;
    private int id_;
    /**
     * <pre>
     * The unique identifier for this tap.
     * </pre>
     *
     * <code>required uint32 id = 1;</code>
     * @return Whether the id field is set.
     */
    @java.lang.Override
    public boolean hasId() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <pre>
     * The unique identifier for this tap.
     * </pre>
     *
     * <code>required uint32 id = 1;</code>
     * @return The id.
     */
    @java.lang.Override
    public int getId() {
      return id_;
    }

    public static final int NAME_FIELD_NUMBER = 2;
    private volatile java.lang.Object name_;
    /**
     * <pre>
     * The name of the tap, a free-form string ("Main tap", "Wet bar", ...)
     * </pre>
     *
     * <code>required string name = 2;</code>
     * @return Whether the name field is set.
     */
    @java.lang.Override
    public boolean hasName() {
      return ((bitField0_ & 0x00000002) != 0);
    }
    /**
     * <pre>
     * The name of the tap, a free-form string ("Main tap", "Wet bar", ...)
     * </pre>
     *
     * <code>required 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>
     * The name of the tap, a free-form string ("Main tap", "Wet bar", ...)
     * </pre>
     *
     * <code>required 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 METER_NAME_FIELD_NUMBER = 3;
    private volatile java.lang.Object meterName_;
    /**
     * <pre>
     * The name of the flow meter assigned to this tap.
     * Deprecated in favor of 'meter'
     * </pre>
     *
     * <code>optional string meter_name = 3 [deprecated = true];</code>
     * @deprecated
     * @return Whether the meterName field is set.
     */
    @java.lang.Override
    @java.lang.Deprecated public boolean hasMeterName() {
      return ((bitField0_ & 0x00000004) != 0);
    }
    /**
     * <pre>
     * The name of the flow meter assigned to this tap.
     * Deprecated in favor of 'meter'
     * </pre>
     *
     * <code>optional string meter_name = 3 [deprecated = true];</code>
     * @deprecated
     * @return The meterName.
     */
    @java.lang.Override
    @java.lang.Deprecated public java.lang.String getMeterName() {
      java.lang.Object ref = meterName_;
      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()) {
          meterName_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * The name of the flow meter assigned to this tap.
     * Deprecated in favor of 'meter'
     * </pre>
     *
     * <code>optional string meter_name = 3 [deprecated = true];</code>
     * @deprecated
     * @return The bytes for meterName.
     */
    @java.lang.Override
    @java.lang.Deprecated public com.google.protobuf.ByteString
        getMeterNameBytes() {
      java.lang.Object ref = meterName_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        meterName_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int METER_FIELD_NUMBER = 12;
    private org.kegbot.proto.Models.FlowMeter meter_;
    /**
     * <pre>
     * The currently-connected meter, if any.
     * </pre>
     *
     * <code>optional .FlowMeter meter = 12;</code>
     * @return Whether the meter field is set.
     */
    @java.lang.Override
    public boolean hasMeter() {
      return ((bitField0_ & 0x00000008) != 0);
    }
    /**
     * <pre>
     * The currently-connected meter, if any.
     * </pre>
     *
     * <code>optional .FlowMeter meter = 12;</code>
     * @return The meter.
     */
    @java.lang.Override
    public org.kegbot.proto.Models.FlowMeter getMeter() {
      return meter_ == null ? org.kegbot.proto.Models.FlowMeter.getDefaultInstance() : meter_;
    }
    /**
     * <pre>
     * The currently-connected meter, if any.
     * </pre>
     *
     * <code>optional .FlowMeter meter = 12;</code>
     */
    @java.lang.Override
    public org.kegbot.proto.Models.FlowMeterOrBuilder getMeterOrBuilder() {
      return meter_ == null ? org.kegbot.proto.Models.FlowMeter.getDefaultInstance() : meter_;
    }

    public static final int TOGGLE_FIELD_NUMBER = 13;
    private org.kegbot.proto.Models.FlowToggle toggle_;
    /**
     * <pre>
     * The currently-connected toggle, if any.
     * </pre>
     *
     * <code>optional .FlowToggle toggle = 13;</code>
     * @return Whether the toggle field is set.
     */
    @java.lang.Override
    public boolean hasToggle() {
      return ((bitField0_ & 0x00000010) != 0);
    }
    /**
     * <pre>
     * The currently-connected toggle, if any.
     * </pre>
     *
     * <code>optional .FlowToggle toggle = 13;</code>
     * @return The toggle.
     */
    @java.lang.Override
    public org.kegbot.proto.Models.FlowToggle getToggle() {
      return toggle_ == null ? org.kegbot.proto.Models.FlowToggle.getDefaultInstance() : toggle_;
    }
    /**
     * <pre>
     * The currently-connected toggle, if any.
     * </pre>
     *
     * <code>optional .FlowToggle toggle = 13;</code>
     */
    @java.lang.Override
    public org.kegbot.proto.Models.FlowToggleOrBuilder getToggleOrBuilder() {
      return toggle_ == null ? org.kegbot.proto.Models.FlowToggle.getDefaultInstance() : toggle_;
    }

    public static final int THERMO_SENSOR_FIELD_NUMBER = 14;
    private org.kegbot.proto.Models.ThermoSensor thermoSensor_;
    /**
     * <pre>
     * The currently-connected temperature sensor, if any.
     * </pre>
     *
     * <code>optional .ThermoSensor thermo_sensor = 14;</code>
     * @return Whether the thermoSensor field is set.
     */
    @java.lang.Override
    public boolean hasThermoSensor() {
      return ((bitField0_ & 0x00000020) != 0);
    }
    /**
     * <pre>
     * The currently-connected temperature sensor, if any.
     * </pre>
     *
     * <code>optional .ThermoSensor thermo_sensor = 14;</code>
     * @return The thermoSensor.
     */
    @java.lang.Override
    public org.kegbot.proto.Models.ThermoSensor getThermoSensor() {
      return thermoSensor_ == null ? org.kegbot.proto.Models.ThermoSensor.getDefaultInstance() : thermoSensor_;
    }
    /**
     * <pre>
     * The currently-connected temperature sensor, if any.
     * </pre>
     *
     * <code>optional .ThermoSensor thermo_sensor = 14;</code>
     */
    @java.lang.Override
    public org.kegbot.proto.Models.ThermoSensorOrBuilder getThermoSensorOrBuilder() {
      return thermoSensor_ == null ? org.kegbot.proto.Models.ThermoSensor.getDefaultInstance() : thermoSensor_;
    }

    public static final int RELAY_NAME_FIELD_NUMBER = 4;
    private volatile java.lang.Object relayName_;
    /**
     * <pre>
     * The relay name of the tap.
     * </pre>
     *
     * <code>optional string relay_name = 4;</code>
     * @return Whether the relayName field is set.
     */
    @java.lang.Override
    public boolean hasRelayName() {
      return ((bitField0_ & 0x00000040) != 0);
    }
    /**
     * <pre>
     * The relay name of the tap.
     * </pre>
     *
     * <code>optional string relay_name = 4;</code>
     * @return The relayName.
     */
    @java.lang.Override
    public java.lang.String getRelayName() {
      java.lang.Object ref = relayName_;
      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()) {
          relayName_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * The relay name of the tap.
     * </pre>
     *
     * <code>optional string relay_name = 4;</code>
     * @return The bytes for relayName.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getRelayNameBytes() {
      java.lang.Object ref = relayName_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        relayName_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int ML_PER_TICK_FIELD_NUMBER = 5;
    private double mlPerTick_;
    /**
     * <pre>
     * Size of each flowmeter tick, in milliliters.
     * </pre>
     *
     * <code>optional double ml_per_tick = 5;</code>
     * @return Whether the mlPerTick field is set.
     */
    @java.lang.Override
    public boolean hasMlPerTick() {
      return ((bitField0_ & 0x00000080) != 0);
    }
    /**
     * <pre>
     * Size of each flowmeter tick, in milliliters.
     * </pre>
     *
     * <code>optional double ml_per_tick = 5;</code>
     * @return The mlPerTick.
     */
    @java.lang.Override
    public double getMlPerTick() {
      return mlPerTick_;
    }

    public static final int DESCRIPTION_FIELD_NUMBER = 6;
    private volatile java.lang.Object description_;
    /**
     * <pre>
     * A longer description of the tap.
     * </pre>
     *
     * <code>optional string description = 6;</code>
     * @return Whether the description field is set.
     */
    @java.lang.Override
    public boolean hasDescription() {
      return ((bitField0_ & 0x00000100) != 0);
    }
    /**
     * <pre>
     * A longer description of the tap.
     * </pre>
     *
     * <code>optional string description = 6;</code>
     * @return The description.
     */
    @java.lang.Override
    public java.lang.String getDescription() {
      java.lang.Object ref = description_;
      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()) {
          description_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * A longer description of the tap.
     * </pre>
     *
     * <code>optional string description = 6;</code>
     * @return The bytes for description.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getDescriptionBytes() {
      java.lang.Object ref = description_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        description_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int THERMO_SENSOR_ID_FIELD_NUMBER = 8;
    private int thermoSensorId_;
    /**
     * <pre>
     * The temperature sensor for the tap, if any.
     * </pre>
     *
     * <code>optional uint32 thermo_sensor_id = 8;</code>
     * @return Whether the thermoSensorId field is set.
     */
    @java.lang.Override
    public boolean hasThermoSensorId() {
      return ((bitField0_ & 0x00000200) != 0);
    }
    /**
     * <pre>
     * The temperature sensor for the tap, if any.
     * </pre>
     *
     * <code>optional uint32 thermo_sensor_id = 8;</code>
     * @return The thermoSensorId.
     */
    @java.lang.Override
    public int getThermoSensorId() {
      return thermoSensorId_;
    }

    public static final int LAST_TEMPERATURE_FIELD_NUMBER = 9;
    private org.kegbot.proto.Models.ThermoLog lastTemperature_;
    /**
     * <pre>
     * The last temperature log, if any.
     * </pre>
     *
     * <code>optional .ThermoLog last_temperature = 9;</code>
     * @return Whether the lastTemperature field is set.
     */
    @java.lang.Override
    public boolean hasLastTemperature() {
      return ((bitField0_ & 0x00000400) != 0);
    }
    /**
     * <pre>
     * The last temperature log, if any.
     * </pre>
     *
     * <code>optional .ThermoLog last_temperature = 9;</code>
     * @return The lastTemperature.
     */
    @java.lang.Override
    public org.kegbot.proto.Models.ThermoLog getLastTemperature() {
      return lastTemperature_ == null ? org.kegbot.proto.Models.ThermoLog.getDefaultInstance() : lastTemperature_;
    }
    /**
     * <pre>
     * The last temperature log, if any.
     * </pre>
     *
     * <code>optional .ThermoLog last_temperature = 9;</code>
     */
    @java.lang.Override
    public org.kegbot.proto.Models.ThermoLogOrBuilder getLastTemperatureOrBuilder() {
      return lastTemperature_ == null ? org.kegbot.proto.Models.ThermoLog.getDefaultInstance() : lastTemperature_;
    }

    public static final int CURRENT_KEG_ID_FIELD_NUMBER = 10;
    private int currentKegId_;
    /**
     * <pre>
     * The Keg currently assigned to the tap.  May be unset if there is no keg
     * configured.
     * </pre>
     *
     * <code>optional uint32 current_keg_id = 10;</code>
     * @return Whether the currentKegId field is set.
     */
    @java.lang.Override
    public boolean hasCurrentKegId() {
      return ((bitField0_ & 0x00000800) != 0);
    }
    /**
     * <pre>
     * The Keg currently assigned to the tap.  May be unset if there is no keg
     * configured.
     * </pre>
     *
     * <code>optional uint32 current_keg_id = 10;</code>
     * @return The currentKegId.
     */
    @java.lang.Override
    public int getCurrentKegId() {
      return currentKegId_;
    }

    public static final int CURRENT_KEG_FIELD_NUMBER = 11;
    private org.kegbot.proto.Models.Keg currentKeg_;
    /**
     * <code>optional .Keg current_keg = 11;</code>
     * @return Whether the currentKeg field is set.
     */
    @java.lang.Override
    public boolean hasCurrentKeg() {
      return ((bitField0_ & 0x00001000) != 0);
    }
    /**
     * <code>optional .Keg current_keg = 11;</code>
     * @return The currentKeg.
     */
    @java.lang.Override
    public org.kegbot.proto.Models.Keg getCurrentKeg() {
      return currentKeg_ == null ? org.kegbot.proto.Models.Keg.getDefaultInstance() : currentKeg_;
    }
    /**
     * <code>optional .Keg current_keg = 11;</code>
     */
    @java.lang.Override
    public org.kegbot.proto.Models.KegOrBuilder getCurrentKegOrBuilder() {
      return currentKeg_ == null ? org.kegbot.proto.Models.Keg.getDefaultInstance() : currentKeg_;
    }

    public static final int SORT_ORDER_FIELD_NUMBER = 15;
    private int sortOrder_;
    /**
     * <code>optional uint32 sort_order = 15 [default = 0];</code>
     * @return Whether the sortOrder field is set.
     */
    @java.lang.Override
    public boolean hasSortOrder() {
      return ((bitField0_ & 0x00002000) != 0);
    }
    /**
     * <code>optional uint32 sort_order = 15 [default = 0];</code>
     * @return The sortOrder.
     */
    @java.lang.Override
    public int getSortOrder() {
      return sortOrder_;
    }

    public static org.kegbot.proto.Models.KegTap parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.KegTap parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.KegTap parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.KegTap parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.KegTap parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.KegTap parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.KegTap parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.KegTap 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 org.kegbot.proto.Models.KegTap parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.KegTap 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 org.kegbot.proto.Models.KegTap parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.KegTap 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(org.kegbot.proto.Models.KegTap 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>
     * Describes a tap which is available for pouring beer.
     * </pre>
     *
     * Protobuf type {@code KegTap}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:KegTap)
        org.kegbot.proto.Models.KegTapOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return org.kegbot.proto.Models.internal_static_KegTap_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return org.kegbot.proto.Models.internal_static_KegTap_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                org.kegbot.proto.Models.KegTap.class, org.kegbot.proto.Models.KegTap.Builder.class);
      }

      // Construct using org.kegbot.proto.Models.KegTap.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
          getMeterFieldBuilder();
          getToggleFieldBuilder();
          getThermoSensorFieldBuilder();
          getLastTemperatureFieldBuilder();
          getCurrentKegFieldBuilder();
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        id_ = 0;
        bitField0_ = (bitField0_ & ~0x00000001);
        name_ = "";
        bitField0_ = (bitField0_ & ~0x00000002);
        meterName_ = "";
        bitField0_ = (bitField0_ & ~0x00000004);
        if (meterBuilder_ == null) {
          meter_ = null;
        } else {
          meterBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000008);
        if (toggleBuilder_ == null) {
          toggle_ = null;
        } else {
          toggleBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000010);
        if (thermoSensorBuilder_ == null) {
          thermoSensor_ = null;
        } else {
          thermoSensorBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000020);
        relayName_ = "";
        bitField0_ = (bitField0_ & ~0x00000040);
        mlPerTick_ = 0D;
        bitField0_ = (bitField0_ & ~0x00000080);
        description_ = "";
        bitField0_ = (bitField0_ & ~0x00000100);
        thermoSensorId_ = 0;
        bitField0_ = (bitField0_ & ~0x00000200);
        if (lastTemperatureBuilder_ == null) {
          lastTemperature_ = null;
        } else {
          lastTemperatureBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000400);
        currentKegId_ = 0;
        bitField0_ = (bitField0_ & ~0x00000800);
        if (currentKegBuilder_ == null) {
          currentKeg_ = null;
        } else {
          currentKegBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00001000);
        sortOrder_ = 0;
        bitField0_ = (bitField0_ & ~0x00002000);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return org.kegbot.proto.Models.internal_static_KegTap_descriptor;
      }

      @java.lang.Override
      public org.kegbot.proto.Models.KegTap getDefaultInstanceForType() {
        return org.kegbot.proto.Models.KegTap.getDefaultInstance();
      }

      @java.lang.Override
      public org.kegbot.proto.Models.KegTap build() {
        org.kegbot.proto.Models.KegTap result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public org.kegbot.proto.Models.KegTap buildPartial() {
        org.kegbot.proto.Models.KegTap result = new org.kegbot.proto.Models.KegTap(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)) {
          to_bitField0_ |= 0x00000002;
        }
        result.name_ = name_;
        if (((from_bitField0_ & 0x00000004) != 0)) {
          to_bitField0_ |= 0x00000004;
        }
        result.meterName_ = meterName_;
        if (((from_bitField0_ & 0x00000008) != 0)) {
          if (meterBuilder_ == null) {
            result.meter_ = meter_;
          } else {
            result.meter_ = meterBuilder_.build();
          }
          to_bitField0_ |= 0x00000008;
        }
        if (((from_bitField0_ & 0x00000010) != 0)) {
          if (toggleBuilder_ == null) {
            result.toggle_ = toggle_;
          } else {
            result.toggle_ = toggleBuilder_.build();
          }
          to_bitField0_ |= 0x00000010;
        }
        if (((from_bitField0_ & 0x00000020) != 0)) {
          if (thermoSensorBuilder_ == null) {
            result.thermoSensor_ = thermoSensor_;
          } else {
            result.thermoSensor_ = thermoSensorBuilder_.build();
          }
          to_bitField0_ |= 0x00000020;
        }
        if (((from_bitField0_ & 0x00000040) != 0)) {
          to_bitField0_ |= 0x00000040;
        }
        result.relayName_ = relayName_;
        if (((from_bitField0_ & 0x00000080) != 0)) {
          result.mlPerTick_ = mlPerTick_;
          to_bitField0_ |= 0x00000080;
        }
        if (((from_bitField0_ & 0x00000100) != 0)) {
          to_bitField0_ |= 0x00000100;
        }
        result.description_ = description_;
        if (((from_bitField0_ & 0x00000200) != 0)) {
          result.thermoSensorId_ = thermoSensorId_;
          to_bitField0_ |= 0x00000200;
        }
        if (((from_bitField0_ & 0x00000400) != 0)) {
          if (lastTemperatureBuilder_ == null) {
            result.lastTemperature_ = lastTemperature_;
          } else {
            result.lastTemperature_ = lastTemperatureBuilder_.build();
          }
          to_bitField0_ |= 0x00000400;
        }
        if (((from_bitField0_ & 0x00000800) != 0)) {
          result.currentKegId_ = currentKegId_;
          to_bitField0_ |= 0x00000800;
        }
        if (((from_bitField0_ & 0x00001000) != 0)) {
          if (currentKegBuilder_ == null) {
            result.currentKeg_ = currentKeg_;
          } else {
            result.currentKeg_ = currentKegBuilder_.build();
          }
          to_bitField0_ |= 0x00001000;
        }
        if (((from_bitField0_ & 0x00002000) != 0)) {
          result.sortOrder_ = sortOrder_;
          to_bitField0_ |= 0x00002000;
        }
        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);
      }
      private int bitField0_;

      private int id_ ;
      /**
       * <pre>
       * The unique identifier for this tap.
       * </pre>
       *
       * <code>required uint32 id = 1;</code>
       * @return Whether the id field is set.
       */
      @java.lang.Override
      public boolean hasId() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <pre>
       * The unique identifier for this tap.
       * </pre>
       *
       * <code>required uint32 id = 1;</code>
       * @return The id.
       */
      @java.lang.Override
      public int getId() {
        return id_;
      }
      /**
       * <pre>
       * The unique identifier for this tap.
       * </pre>
       *
       * <code>required uint32 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>
       * The unique identifier for this tap.
       * </pre>
       *
       * <code>required uint32 id = 1;</code>
       * @return This builder for chaining.
       */
      public Builder clearId() {
        bitField0_ = (bitField0_ & ~0x00000001);
        id_ = 0;
        onChanged();
        return this;
      }

      private java.lang.Object name_ = "";
      /**
       * <pre>
       * The name of the tap, a free-form string ("Main tap", "Wet bar", ...)
       * </pre>
       *
       * <code>required string name = 2;</code>
       * @return Whether the name field is set.
       */
      public boolean hasName() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <pre>
       * The name of the tap, a free-form string ("Main tap", "Wet bar", ...)
       * </pre>
       *
       * <code>required 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>
       * The name of the tap, a free-form string ("Main tap", "Wet bar", ...)
       * </pre>
       *
       * <code>required 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>
       * The name of the tap, a free-form string ("Main tap", "Wet bar", ...)
       * </pre>
       *
       * <code>required 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>
       * The name of the tap, a free-form string ("Main tap", "Wet bar", ...)
       * </pre>
       *
       * <code>required string name = 2;</code>
       * @return This builder for chaining.
       */
      public Builder clearName() {
        bitField0_ = (bitField0_ & ~0x00000002);
        name_ = getDefaultInstance().getName();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The name of the tap, a free-form string ("Main tap", "Wet bar", ...)
       * </pre>
       *
       * <code>required 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 meterName_ = "";
      /**
       * <pre>
       * The name of the flow meter assigned to this tap.
       * Deprecated in favor of 'meter'
       * </pre>
       *
       * <code>optional string meter_name = 3 [deprecated = true];</code>
       * @deprecated
       * @return Whether the meterName field is set.
       */
      @java.lang.Deprecated public boolean hasMeterName() {
        return ((bitField0_ & 0x00000004) != 0);
      }
      /**
       * <pre>
       * The name of the flow meter assigned to this tap.
       * Deprecated in favor of 'meter'
       * </pre>
       *
       * <code>optional string meter_name = 3 [deprecated = true];</code>
       * @deprecated
       * @return The meterName.
       */
      @java.lang.Deprecated public java.lang.String getMeterName() {
        java.lang.Object ref = meterName_;
        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()) {
            meterName_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * The name of the flow meter assigned to this tap.
       * Deprecated in favor of 'meter'
       * </pre>
       *
       * <code>optional string meter_name = 3 [deprecated = true];</code>
       * @deprecated
       * @return The bytes for meterName.
       */
      @java.lang.Deprecated public com.google.protobuf.ByteString
          getMeterNameBytes() {
        java.lang.Object ref = meterName_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          meterName_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * The name of the flow meter assigned to this tap.
       * Deprecated in favor of 'meter'
       * </pre>
       *
       * <code>optional string meter_name = 3 [deprecated = true];</code>
       * @deprecated
       * @param value The meterName to set.
       * @return This builder for chaining.
       */
      @java.lang.Deprecated public Builder setMeterName(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
        meterName_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The name of the flow meter assigned to this tap.
       * Deprecated in favor of 'meter'
       * </pre>
       *
       * <code>optional string meter_name = 3 [deprecated = true];</code>
       * @deprecated
       * @return This builder for chaining.
       */
      @java.lang.Deprecated public Builder clearMeterName() {
        bitField0_ = (bitField0_ & ~0x00000004);
        meterName_ = getDefaultInstance().getMeterName();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The name of the flow meter assigned to this tap.
       * Deprecated in favor of 'meter'
       * </pre>
       *
       * <code>optional string meter_name = 3 [deprecated = true];</code>
       * @deprecated
       * @param value The bytes for meterName to set.
       * @return This builder for chaining.
       */
      @java.lang.Deprecated public Builder setMeterNameBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
        meterName_ = value;
        onChanged();
        return this;
      }

      private org.kegbot.proto.Models.FlowMeter meter_;
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.FlowMeter, org.kegbot.proto.Models.FlowMeter.Builder, org.kegbot.proto.Models.FlowMeterOrBuilder> meterBuilder_;
      /**
       * <pre>
       * The currently-connected meter, if any.
       * </pre>
       *
       * <code>optional .FlowMeter meter = 12;</code>
       * @return Whether the meter field is set.
       */
      public boolean hasMeter() {
        return ((bitField0_ & 0x00000008) != 0);
      }
      /**
       * <pre>
       * The currently-connected meter, if any.
       * </pre>
       *
       * <code>optional .FlowMeter meter = 12;</code>
       * @return The meter.
       */
      public org.kegbot.proto.Models.FlowMeter getMeter() {
        if (meterBuilder_ == null) {
          return meter_ == null ? org.kegbot.proto.Models.FlowMeter.getDefaultInstance() : meter_;
        } else {
          return meterBuilder_.getMessage();
        }
      }
      /**
       * <pre>
       * The currently-connected meter, if any.
       * </pre>
       *
       * <code>optional .FlowMeter meter = 12;</code>
       */
      public Builder setMeter(org.kegbot.proto.Models.FlowMeter value) {
        if (meterBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          meter_ = value;
          onChanged();
        } else {
          meterBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000008;
        return this;
      }
      /**
       * <pre>
       * The currently-connected meter, if any.
       * </pre>
       *
       * <code>optional .FlowMeter meter = 12;</code>
       */
      public Builder setMeter(
          org.kegbot.proto.Models.FlowMeter.Builder builderForValue) {
        if (meterBuilder_ == null) {
          meter_ = builderForValue.build();
          onChanged();
        } else {
          meterBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000008;
        return this;
      }
      /**
       * <pre>
       * The currently-connected meter, if any.
       * </pre>
       *
       * <code>optional .FlowMeter meter = 12;</code>
       */
      public Builder mergeMeter(org.kegbot.proto.Models.FlowMeter value) {
        if (meterBuilder_ == null) {
          if (((bitField0_ & 0x00000008) != 0) &&
              meter_ != null &&
              meter_ != org.kegbot.proto.Models.FlowMeter.getDefaultInstance()) {
            meter_ =
              org.kegbot.proto.Models.FlowMeter.newBuilder(meter_).mergeFrom(value).buildPartial();
          } else {
            meter_ = value;
          }
          onChanged();
        } else {
          meterBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000008;
        return this;
      }
      /**
       * <pre>
       * The currently-connected meter, if any.
       * </pre>
       *
       * <code>optional .FlowMeter meter = 12;</code>
       */
      public Builder clearMeter() {
        if (meterBuilder_ == null) {
          meter_ = null;
          onChanged();
        } else {
          meterBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000008);
        return this;
      }
      /**
       * <pre>
       * The currently-connected meter, if any.
       * </pre>
       *
       * <code>optional .FlowMeter meter = 12;</code>
       */
      public org.kegbot.proto.Models.FlowMeter.Builder getMeterBuilder() {
        bitField0_ |= 0x00000008;
        onChanged();
        return getMeterFieldBuilder().getBuilder();
      }
      /**
       * <pre>
       * The currently-connected meter, if any.
       * </pre>
       *
       * <code>optional .FlowMeter meter = 12;</code>
       */
      public org.kegbot.proto.Models.FlowMeterOrBuilder getMeterOrBuilder() {
        if (meterBuilder_ != null) {
          return meterBuilder_.getMessageOrBuilder();
        } else {
          return meter_ == null ?
              org.kegbot.proto.Models.FlowMeter.getDefaultInstance() : meter_;
        }
      }
      /**
       * <pre>
       * The currently-connected meter, if any.
       * </pre>
       *
       * <code>optional .FlowMeter meter = 12;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.FlowMeter, org.kegbot.proto.Models.FlowMeter.Builder, org.kegbot.proto.Models.FlowMeterOrBuilder> 
          getMeterFieldBuilder() {
        if (meterBuilder_ == null) {
          meterBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              org.kegbot.proto.Models.FlowMeter, org.kegbot.proto.Models.FlowMeter.Builder, org.kegbot.proto.Models.FlowMeterOrBuilder>(
                  getMeter(),
                  getParentForChildren(),
                  isClean());
          meter_ = null;
        }
        return meterBuilder_;
      }

      private org.kegbot.proto.Models.FlowToggle toggle_;
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.FlowToggle, org.kegbot.proto.Models.FlowToggle.Builder, org.kegbot.proto.Models.FlowToggleOrBuilder> toggleBuilder_;
      /**
       * <pre>
       * The currently-connected toggle, if any.
       * </pre>
       *
       * <code>optional .FlowToggle toggle = 13;</code>
       * @return Whether the toggle field is set.
       */
      public boolean hasToggle() {
        return ((bitField0_ & 0x00000010) != 0);
      }
      /**
       * <pre>
       * The currently-connected toggle, if any.
       * </pre>
       *
       * <code>optional .FlowToggle toggle = 13;</code>
       * @return The toggle.
       */
      public org.kegbot.proto.Models.FlowToggle getToggle() {
        if (toggleBuilder_ == null) {
          return toggle_ == null ? org.kegbot.proto.Models.FlowToggle.getDefaultInstance() : toggle_;
        } else {
          return toggleBuilder_.getMessage();
        }
      }
      /**
       * <pre>
       * The currently-connected toggle, if any.
       * </pre>
       *
       * <code>optional .FlowToggle toggle = 13;</code>
       */
      public Builder setToggle(org.kegbot.proto.Models.FlowToggle value) {
        if (toggleBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          toggle_ = value;
          onChanged();
        } else {
          toggleBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000010;
        return this;
      }
      /**
       * <pre>
       * The currently-connected toggle, if any.
       * </pre>
       *
       * <code>optional .FlowToggle toggle = 13;</code>
       */
      public Builder setToggle(
          org.kegbot.proto.Models.FlowToggle.Builder builderForValue) {
        if (toggleBuilder_ == null) {
          toggle_ = builderForValue.build();
          onChanged();
        } else {
          toggleBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000010;
        return this;
      }
      /**
       * <pre>
       * The currently-connected toggle, if any.
       * </pre>
       *
       * <code>optional .FlowToggle toggle = 13;</code>
       */
      public Builder mergeToggle(org.kegbot.proto.Models.FlowToggle value) {
        if (toggleBuilder_ == null) {
          if (((bitField0_ & 0x00000010) != 0) &&
              toggle_ != null &&
              toggle_ != org.kegbot.proto.Models.FlowToggle.getDefaultInstance()) {
            toggle_ =
              org.kegbot.proto.Models.FlowToggle.newBuilder(toggle_).mergeFrom(value).buildPartial();
          } else {
            toggle_ = value;
          }
          onChanged();
        } else {
          toggleBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000010;
        return this;
      }
      /**
       * <pre>
       * The currently-connected toggle, if any.
       * </pre>
       *
       * <code>optional .FlowToggle toggle = 13;</code>
       */
      public Builder clearToggle() {
        if (toggleBuilder_ == null) {
          toggle_ = null;
          onChanged();
        } else {
          toggleBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000010);
        return this;
      }
      /**
       * <pre>
       * The currently-connected toggle, if any.
       * </pre>
       *
       * <code>optional .FlowToggle toggle = 13;</code>
       */
      public org.kegbot.proto.Models.FlowToggle.Builder getToggleBuilder() {
        bitField0_ |= 0x00000010;
        onChanged();
        return getToggleFieldBuilder().getBuilder();
      }
      /**
       * <pre>
       * The currently-connected toggle, if any.
       * </pre>
       *
       * <code>optional .FlowToggle toggle = 13;</code>
       */
      public org.kegbot.proto.Models.FlowToggleOrBuilder getToggleOrBuilder() {
        if (toggleBuilder_ != null) {
          return toggleBuilder_.getMessageOrBuilder();
        } else {
          return toggle_ == null ?
              org.kegbot.proto.Models.FlowToggle.getDefaultInstance() : toggle_;
        }
      }
      /**
       * <pre>
       * The currently-connected toggle, if any.
       * </pre>
       *
       * <code>optional .FlowToggle toggle = 13;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.FlowToggle, org.kegbot.proto.Models.FlowToggle.Builder, org.kegbot.proto.Models.FlowToggleOrBuilder> 
          getToggleFieldBuilder() {
        if (toggleBuilder_ == null) {
          toggleBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              org.kegbot.proto.Models.FlowToggle, org.kegbot.proto.Models.FlowToggle.Builder, org.kegbot.proto.Models.FlowToggleOrBuilder>(
                  getToggle(),
                  getParentForChildren(),
                  isClean());
          toggle_ = null;
        }
        return toggleBuilder_;
      }

      private org.kegbot.proto.Models.ThermoSensor thermoSensor_;
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.ThermoSensor, org.kegbot.proto.Models.ThermoSensor.Builder, org.kegbot.proto.Models.ThermoSensorOrBuilder> thermoSensorBuilder_;
      /**
       * <pre>
       * The currently-connected temperature sensor, if any.
       * </pre>
       *
       * <code>optional .ThermoSensor thermo_sensor = 14;</code>
       * @return Whether the thermoSensor field is set.
       */
      public boolean hasThermoSensor() {
        return ((bitField0_ & 0x00000020) != 0);
      }
      /**
       * <pre>
       * The currently-connected temperature sensor, if any.
       * </pre>
       *
       * <code>optional .ThermoSensor thermo_sensor = 14;</code>
       * @return The thermoSensor.
       */
      public org.kegbot.proto.Models.ThermoSensor getThermoSensor() {
        if (thermoSensorBuilder_ == null) {
          return thermoSensor_ == null ? org.kegbot.proto.Models.ThermoSensor.getDefaultInstance() : thermoSensor_;
        } else {
          return thermoSensorBuilder_.getMessage();
        }
      }
      /**
       * <pre>
       * The currently-connected temperature sensor, if any.
       * </pre>
       *
       * <code>optional .ThermoSensor thermo_sensor = 14;</code>
       */
      public Builder setThermoSensor(org.kegbot.proto.Models.ThermoSensor value) {
        if (thermoSensorBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          thermoSensor_ = value;
          onChanged();
        } else {
          thermoSensorBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000020;
        return this;
      }
      /**
       * <pre>
       * The currently-connected temperature sensor, if any.
       * </pre>
       *
       * <code>optional .ThermoSensor thermo_sensor = 14;</code>
       */
      public Builder setThermoSensor(
          org.kegbot.proto.Models.ThermoSensor.Builder builderForValue) {
        if (thermoSensorBuilder_ == null) {
          thermoSensor_ = builderForValue.build();
          onChanged();
        } else {
          thermoSensorBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000020;
        return this;
      }
      /**
       * <pre>
       * The currently-connected temperature sensor, if any.
       * </pre>
       *
       * <code>optional .ThermoSensor thermo_sensor = 14;</code>
       */
      public Builder mergeThermoSensor(org.kegbot.proto.Models.ThermoSensor value) {
        if (thermoSensorBuilder_ == null) {
          if (((bitField0_ & 0x00000020) != 0) &&
              thermoSensor_ != null &&
              thermoSensor_ != org.kegbot.proto.Models.ThermoSensor.getDefaultInstance()) {
            thermoSensor_ =
              org.kegbot.proto.Models.ThermoSensor.newBuilder(thermoSensor_).mergeFrom(value).buildPartial();
          } else {
            thermoSensor_ = value;
          }
          onChanged();
        } else {
          thermoSensorBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000020;
        return this;
      }
      /**
       * <pre>
       * The currently-connected temperature sensor, if any.
       * </pre>
       *
       * <code>optional .ThermoSensor thermo_sensor = 14;</code>
       */
      public Builder clearThermoSensor() {
        if (thermoSensorBuilder_ == null) {
          thermoSensor_ = null;
          onChanged();
        } else {
          thermoSensorBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000020);
        return this;
      }
      /**
       * <pre>
       * The currently-connected temperature sensor, if any.
       * </pre>
       *
       * <code>optional .ThermoSensor thermo_sensor = 14;</code>
       */
      public org.kegbot.proto.Models.ThermoSensor.Builder getThermoSensorBuilder() {
        bitField0_ |= 0x00000020;
        onChanged();
        return getThermoSensorFieldBuilder().getBuilder();
      }
      /**
       * <pre>
       * The currently-connected temperature sensor, if any.
       * </pre>
       *
       * <code>optional .ThermoSensor thermo_sensor = 14;</code>
       */
      public org.kegbot.proto.Models.ThermoSensorOrBuilder getThermoSensorOrBuilder() {
        if (thermoSensorBuilder_ != null) {
          return thermoSensorBuilder_.getMessageOrBuilder();
        } else {
          return thermoSensor_ == null ?
              org.kegbot.proto.Models.ThermoSensor.getDefaultInstance() : thermoSensor_;
        }
      }
      /**
       * <pre>
       * The currently-connected temperature sensor, if any.
       * </pre>
       *
       * <code>optional .ThermoSensor thermo_sensor = 14;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.ThermoSensor, org.kegbot.proto.Models.ThermoSensor.Builder, org.kegbot.proto.Models.ThermoSensorOrBuilder> 
          getThermoSensorFieldBuilder() {
        if (thermoSensorBuilder_ == null) {
          thermoSensorBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              org.kegbot.proto.Models.ThermoSensor, org.kegbot.proto.Models.ThermoSensor.Builder, org.kegbot.proto.Models.ThermoSensorOrBuilder>(
                  getThermoSensor(),
                  getParentForChildren(),
                  isClean());
          thermoSensor_ = null;
        }
        return thermoSensorBuilder_;
      }

      private java.lang.Object relayName_ = "";
      /**
       * <pre>
       * The relay name of the tap.
       * </pre>
       *
       * <code>optional string relay_name = 4;</code>
       * @return Whether the relayName field is set.
       */
      public boolean hasRelayName() {
        return ((bitField0_ & 0x00000040) != 0);
      }
      /**
       * <pre>
       * The relay name of the tap.
       * </pre>
       *
       * <code>optional string relay_name = 4;</code>
       * @return The relayName.
       */
      public java.lang.String getRelayName() {
        java.lang.Object ref = relayName_;
        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()) {
            relayName_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * The relay name of the tap.
       * </pre>
       *
       * <code>optional string relay_name = 4;</code>
       * @return The bytes for relayName.
       */
      public com.google.protobuf.ByteString
          getRelayNameBytes() {
        java.lang.Object ref = relayName_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          relayName_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * The relay name of the tap.
       * </pre>
       *
       * <code>optional string relay_name = 4;</code>
       * @param value The relayName to set.
       * @return This builder for chaining.
       */
      public Builder setRelayName(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000040;
        relayName_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The relay name of the tap.
       * </pre>
       *
       * <code>optional string relay_name = 4;</code>
       * @return This builder for chaining.
       */
      public Builder clearRelayName() {
        bitField0_ = (bitField0_ & ~0x00000040);
        relayName_ = getDefaultInstance().getRelayName();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The relay name of the tap.
       * </pre>
       *
       * <code>optional string relay_name = 4;</code>
       * @param value The bytes for relayName to set.
       * @return This builder for chaining.
       */
      public Builder setRelayNameBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000040;
        relayName_ = value;
        onChanged();
        return this;
      }

      private double mlPerTick_ ;
      /**
       * <pre>
       * Size of each flowmeter tick, in milliliters.
       * </pre>
       *
       * <code>optional double ml_per_tick = 5;</code>
       * @return Whether the mlPerTick field is set.
       */
      @java.lang.Override
      public boolean hasMlPerTick() {
        return ((bitField0_ & 0x00000080) != 0);
      }
      /**
       * <pre>
       * Size of each flowmeter tick, in milliliters.
       * </pre>
       *
       * <code>optional double ml_per_tick = 5;</code>
       * @return The mlPerTick.
       */
      @java.lang.Override
      public double getMlPerTick() {
        return mlPerTick_;
      }
      /**
       * <pre>
       * Size of each flowmeter tick, in milliliters.
       * </pre>
       *
       * <code>optional double ml_per_tick = 5;</code>
       * @param value The mlPerTick to set.
       * @return This builder for chaining.
       */
      public Builder setMlPerTick(double value) {
        bitField0_ |= 0x00000080;
        mlPerTick_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Size of each flowmeter tick, in milliliters.
       * </pre>
       *
       * <code>optional double ml_per_tick = 5;</code>
       * @return This builder for chaining.
       */
      public Builder clearMlPerTick() {
        bitField0_ = (bitField0_ & ~0x00000080);
        mlPerTick_ = 0D;
        onChanged();
        return this;
      }

      private java.lang.Object description_ = "";
      /**
       * <pre>
       * A longer description of the tap.
       * </pre>
       *
       * <code>optional string description = 6;</code>
       * @return Whether the description field is set.
       */
      public boolean hasDescription() {
        return ((bitField0_ & 0x00000100) != 0);
      }
      /**
       * <pre>
       * A longer description of the tap.
       * </pre>
       *
       * <code>optional string description = 6;</code>
       * @return The description.
       */
      public java.lang.String getDescription() {
        java.lang.Object ref = description_;
        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()) {
            description_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * A longer description of the tap.
       * </pre>
       *
       * <code>optional string description = 6;</code>
       * @return The bytes for description.
       */
      public com.google.protobuf.ByteString
          getDescriptionBytes() {
        java.lang.Object ref = description_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          description_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * A longer description of the tap.
       * </pre>
       *
       * <code>optional string description = 6;</code>
       * @param value The description to set.
       * @return This builder for chaining.
       */
      public Builder setDescription(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000100;
        description_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * A longer description of the tap.
       * </pre>
       *
       * <code>optional string description = 6;</code>
       * @return This builder for chaining.
       */
      public Builder clearDescription() {
        bitField0_ = (bitField0_ & ~0x00000100);
        description_ = getDefaultInstance().getDescription();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * A longer description of the tap.
       * </pre>
       *
       * <code>optional string description = 6;</code>
       * @param value The bytes for description to set.
       * @return This builder for chaining.
       */
      public Builder setDescriptionBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000100;
        description_ = value;
        onChanged();
        return this;
      }

      private int thermoSensorId_ ;
      /**
       * <pre>
       * The temperature sensor for the tap, if any.
       * </pre>
       *
       * <code>optional uint32 thermo_sensor_id = 8;</code>
       * @return Whether the thermoSensorId field is set.
       */
      @java.lang.Override
      public boolean hasThermoSensorId() {
        return ((bitField0_ & 0x00000200) != 0);
      }
      /**
       * <pre>
       * The temperature sensor for the tap, if any.
       * </pre>
       *
       * <code>optional uint32 thermo_sensor_id = 8;</code>
       * @return The thermoSensorId.
       */
      @java.lang.Override
      public int getThermoSensorId() {
        return thermoSensorId_;
      }
      /**
       * <pre>
       * The temperature sensor for the tap, if any.
       * </pre>
       *
       * <code>optional uint32 thermo_sensor_id = 8;</code>
       * @param value The thermoSensorId to set.
       * @return This builder for chaining.
       */
      public Builder setThermoSensorId(int value) {
        bitField0_ |= 0x00000200;
        thermoSensorId_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The temperature sensor for the tap, if any.
       * </pre>
       *
       * <code>optional uint32 thermo_sensor_id = 8;</code>
       * @return This builder for chaining.
       */
      public Builder clearThermoSensorId() {
        bitField0_ = (bitField0_ & ~0x00000200);
        thermoSensorId_ = 0;
        onChanged();
        return this;
      }

      private org.kegbot.proto.Models.ThermoLog lastTemperature_;
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.ThermoLog, org.kegbot.proto.Models.ThermoLog.Builder, org.kegbot.proto.Models.ThermoLogOrBuilder> lastTemperatureBuilder_;
      /**
       * <pre>
       * The last temperature log, if any.
       * </pre>
       *
       * <code>optional .ThermoLog last_temperature = 9;</code>
       * @return Whether the lastTemperature field is set.
       */
      public boolean hasLastTemperature() {
        return ((bitField0_ & 0x00000400) != 0);
      }
      /**
       * <pre>
       * The last temperature log, if any.
       * </pre>
       *
       * <code>optional .ThermoLog last_temperature = 9;</code>
       * @return The lastTemperature.
       */
      public org.kegbot.proto.Models.ThermoLog getLastTemperature() {
        if (lastTemperatureBuilder_ == null) {
          return lastTemperature_ == null ? org.kegbot.proto.Models.ThermoLog.getDefaultInstance() : lastTemperature_;
        } else {
          return lastTemperatureBuilder_.getMessage();
        }
      }
      /**
       * <pre>
       * The last temperature log, if any.
       * </pre>
       *
       * <code>optional .ThermoLog last_temperature = 9;</code>
       */
      public Builder setLastTemperature(org.kegbot.proto.Models.ThermoLog value) {
        if (lastTemperatureBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          lastTemperature_ = value;
          onChanged();
        } else {
          lastTemperatureBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000400;
        return this;
      }
      /**
       * <pre>
       * The last temperature log, if any.
       * </pre>
       *
       * <code>optional .ThermoLog last_temperature = 9;</code>
       */
      public Builder setLastTemperature(
          org.kegbot.proto.Models.ThermoLog.Builder builderForValue) {
        if (lastTemperatureBuilder_ == null) {
          lastTemperature_ = builderForValue.build();
          onChanged();
        } else {
          lastTemperatureBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000400;
        return this;
      }
      /**
       * <pre>
       * The last temperature log, if any.
       * </pre>
       *
       * <code>optional .ThermoLog last_temperature = 9;</code>
       */
      public Builder mergeLastTemperature(org.kegbot.proto.Models.ThermoLog value) {
        if (lastTemperatureBuilder_ == null) {
          if (((bitField0_ & 0x00000400) != 0) &&
              lastTemperature_ != null &&
              lastTemperature_ != org.kegbot.proto.Models.ThermoLog.getDefaultInstance()) {
            lastTemperature_ =
              org.kegbot.proto.Models.ThermoLog.newBuilder(lastTemperature_).mergeFrom(value).buildPartial();
          } else {
            lastTemperature_ = value;
          }
          onChanged();
        } else {
          lastTemperatureBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000400;
        return this;
      }
      /**
       * <pre>
       * The last temperature log, if any.
       * </pre>
       *
       * <code>optional .ThermoLog last_temperature = 9;</code>
       */
      public Builder clearLastTemperature() {
        if (lastTemperatureBuilder_ == null) {
          lastTemperature_ = null;
          onChanged();
        } else {
          lastTemperatureBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000400);
        return this;
      }
      /**
       * <pre>
       * The last temperature log, if any.
       * </pre>
       *
       * <code>optional .ThermoLog last_temperature = 9;</code>
       */
      public org.kegbot.proto.Models.ThermoLog.Builder getLastTemperatureBuilder() {
        bitField0_ |= 0x00000400;
        onChanged();
        return getLastTemperatureFieldBuilder().getBuilder();
      }
      /**
       * <pre>
       * The last temperature log, if any.
       * </pre>
       *
       * <code>optional .ThermoLog last_temperature = 9;</code>
       */
      public org.kegbot.proto.Models.ThermoLogOrBuilder getLastTemperatureOrBuilder() {
        if (lastTemperatureBuilder_ != null) {
          return lastTemperatureBuilder_.getMessageOrBuilder();
        } else {
          return lastTemperature_ == null ?
              org.kegbot.proto.Models.ThermoLog.getDefaultInstance() : lastTemperature_;
        }
      }
      /**
       * <pre>
       * The last temperature log, if any.
       * </pre>
       *
       * <code>optional .ThermoLog last_temperature = 9;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.ThermoLog, org.kegbot.proto.Models.ThermoLog.Builder, org.kegbot.proto.Models.ThermoLogOrBuilder> 
          getLastTemperatureFieldBuilder() {
        if (lastTemperatureBuilder_ == null) {
          lastTemperatureBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              org.kegbot.proto.Models.ThermoLog, org.kegbot.proto.Models.ThermoLog.Builder, org.kegbot.proto.Models.ThermoLogOrBuilder>(
                  getLastTemperature(),
                  getParentForChildren(),
                  isClean());
          lastTemperature_ = null;
        }
        return lastTemperatureBuilder_;
      }

      private int currentKegId_ ;
      /**
       * <pre>
       * The Keg currently assigned to the tap.  May be unset if there is no keg
       * configured.
       * </pre>
       *
       * <code>optional uint32 current_keg_id = 10;</code>
       * @return Whether the currentKegId field is set.
       */
      @java.lang.Override
      public boolean hasCurrentKegId() {
        return ((bitField0_ & 0x00000800) != 0);
      }
      /**
       * <pre>
       * The Keg currently assigned to the tap.  May be unset if there is no keg
       * configured.
       * </pre>
       *
       * <code>optional uint32 current_keg_id = 10;</code>
       * @return The currentKegId.
       */
      @java.lang.Override
      public int getCurrentKegId() {
        return currentKegId_;
      }
      /**
       * <pre>
       * The Keg currently assigned to the tap.  May be unset if there is no keg
       * configured.
       * </pre>
       *
       * <code>optional uint32 current_keg_id = 10;</code>
       * @param value The currentKegId to set.
       * @return This builder for chaining.
       */
      public Builder setCurrentKegId(int value) {
        bitField0_ |= 0x00000800;
        currentKegId_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The Keg currently assigned to the tap.  May be unset if there is no keg
       * configured.
       * </pre>
       *
       * <code>optional uint32 current_keg_id = 10;</code>
       * @return This builder for chaining.
       */
      public Builder clearCurrentKegId() {
        bitField0_ = (bitField0_ & ~0x00000800);
        currentKegId_ = 0;
        onChanged();
        return this;
      }

      private org.kegbot.proto.Models.Keg currentKeg_;
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.Keg, org.kegbot.proto.Models.Keg.Builder, org.kegbot.proto.Models.KegOrBuilder> currentKegBuilder_;
      /**
       * <code>optional .Keg current_keg = 11;</code>
       * @return Whether the currentKeg field is set.
       */
      public boolean hasCurrentKeg() {
        return ((bitField0_ & 0x00001000) != 0);
      }
      /**
       * <code>optional .Keg current_keg = 11;</code>
       * @return The currentKeg.
       */
      public org.kegbot.proto.Models.Keg getCurrentKeg() {
        if (currentKegBuilder_ == null) {
          return currentKeg_ == null ? org.kegbot.proto.Models.Keg.getDefaultInstance() : currentKeg_;
        } else {
          return currentKegBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .Keg current_keg = 11;</code>
       */
      public Builder setCurrentKeg(org.kegbot.proto.Models.Keg value) {
        if (currentKegBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          currentKeg_ = value;
          onChanged();
        } else {
          currentKegBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00001000;
        return this;
      }
      /**
       * <code>optional .Keg current_keg = 11;</code>
       */
      public Builder setCurrentKeg(
          org.kegbot.proto.Models.Keg.Builder builderForValue) {
        if (currentKegBuilder_ == null) {
          currentKeg_ = builderForValue.build();
          onChanged();
        } else {
          currentKegBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00001000;
        return this;
      }
      /**
       * <code>optional .Keg current_keg = 11;</code>
       */
      public Builder mergeCurrentKeg(org.kegbot.proto.Models.Keg value) {
        if (currentKegBuilder_ == null) {
          if (((bitField0_ & 0x00001000) != 0) &&
              currentKeg_ != null &&
              currentKeg_ != org.kegbot.proto.Models.Keg.getDefaultInstance()) {
            currentKeg_ =
              org.kegbot.proto.Models.Keg.newBuilder(currentKeg_).mergeFrom(value).buildPartial();
          } else {
            currentKeg_ = value;
          }
          onChanged();
        } else {
          currentKegBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00001000;
        return this;
      }
      /**
       * <code>optional .Keg current_keg = 11;</code>
       */
      public Builder clearCurrentKeg() {
        if (currentKegBuilder_ == null) {
          currentKeg_ = null;
          onChanged();
        } else {
          currentKegBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00001000);
        return this;
      }
      /**
       * <code>optional .Keg current_keg = 11;</code>
       */
      public org.kegbot.proto.Models.Keg.Builder getCurrentKegBuilder() {
        bitField0_ |= 0x00001000;
        onChanged();
        return getCurrentKegFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .Keg current_keg = 11;</code>
       */
      public org.kegbot.proto.Models.KegOrBuilder getCurrentKegOrBuilder() {
        if (currentKegBuilder_ != null) {
          return currentKegBuilder_.getMessageOrBuilder();
        } else {
          return currentKeg_ == null ?
              org.kegbot.proto.Models.Keg.getDefaultInstance() : currentKeg_;
        }
      }
      /**
       * <code>optional .Keg current_keg = 11;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.Keg, org.kegbot.proto.Models.Keg.Builder, org.kegbot.proto.Models.KegOrBuilder> 
          getCurrentKegFieldBuilder() {
        if (currentKegBuilder_ == null) {
          currentKegBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              org.kegbot.proto.Models.Keg, org.kegbot.proto.Models.Keg.Builder, org.kegbot.proto.Models.KegOrBuilder>(
                  getCurrentKeg(),
                  getParentForChildren(),
                  isClean());
          currentKeg_ = null;
        }
        return currentKegBuilder_;
      }

      private int sortOrder_ ;
      /**
       * <code>optional uint32 sort_order = 15 [default = 0];</code>
       * @return Whether the sortOrder field is set.
       */
      @java.lang.Override
      public boolean hasSortOrder() {
        return ((bitField0_ & 0x00002000) != 0);
      }
      /**
       * <code>optional uint32 sort_order = 15 [default = 0];</code>
       * @return The sortOrder.
       */
      @java.lang.Override
      public int getSortOrder() {
        return sortOrder_;
      }
      /**
       * <code>optional uint32 sort_order = 15 [default = 0];</code>
       * @param value The sortOrder to set.
       * @return This builder for chaining.
       */
      public Builder setSortOrder(int value) {
        bitField0_ |= 0x00002000;
        sortOrder_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional uint32 sort_order = 15 [default = 0];</code>
       * @return This builder for chaining.
       */
      public Builder clearSortOrder() {
        bitField0_ = (bitField0_ & ~0x00002000);
        sortOrder_ = 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:KegTap)
    }

    // @@protoc_insertion_point(class_scope:KegTap)
    private static final org.kegbot.proto.Models.KegTap DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new org.kegbot.proto.Models.KegTap();
    }

    public static org.kegbot.proto.Models.KegTap getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

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

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

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

    @java.lang.Override
    public org.kegbot.proto.Models.KegTap getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface SessionOrBuilder extends
      // @@protoc_insertion_point(interface_extends:Session)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <pre>
     * The unique identifier for this session.
     * </pre>
     *
     * <code>required uint32 id = 1;</code>
     * @return Whether the id field is set.
     */
    boolean hasId();
    /**
     * <pre>
     * The unique identifier for this session.
     * </pre>
     *
     * <code>required uint32 id = 1;</code>
     * @return The id.
     */
    int getId();

    /**
     * <pre>
     * The time this session was started, as an ISO8061 UTC timestamp.
     * </pre>
     *
     * <code>required string start_time = 2;</code>
     * @return Whether the startTime field is set.
     */
    boolean hasStartTime();
    /**
     * <pre>
     * The time this session was started, as an ISO8061 UTC timestamp.
     * </pre>
     *
     * <code>required string start_time = 2;</code>
     * @return The startTime.
     */
    java.lang.String getStartTime();
    /**
     * <pre>
     * The time this session was started, as an ISO8061 UTC timestamp.
     * </pre>
     *
     * <code>required string start_time = 2;</code>
     * @return The bytes for startTime.
     */
    com.google.protobuf.ByteString
        getStartTimeBytes();

    /**
     * <pre>
     * The time this session ended, as an ISO8061 UTC timestamp.
     * </pre>
     *
     * <code>required string end_time = 3;</code>
     * @return Whether the endTime field is set.
     */
    boolean hasEndTime();
    /**
     * <pre>
     * The time this session ended, as an ISO8061 UTC timestamp.
     * </pre>
     *
     * <code>required string end_time = 3;</code>
     * @return The endTime.
     */
    java.lang.String getEndTime();
    /**
     * <pre>
     * The time this session ended, as an ISO8061 UTC timestamp.
     * </pre>
     *
     * <code>required string end_time = 3;</code>
     * @return The bytes for endTime.
     */
    com.google.protobuf.ByteString
        getEndTimeBytes();

    /**
     * <pre>
     * Total volume poured during this session, in milliliters.
     * </pre>
     *
     * <code>required double volume_ml = 4;</code>
     * @return Whether the volumeMl field is set.
     */
    boolean hasVolumeMl();
    /**
     * <pre>
     * Total volume poured during this session, in milliliters.
     * </pre>
     *
     * <code>required double volume_ml = 4;</code>
     * @return The volumeMl.
     */
    double getVolumeMl();

    /**
     * <pre>
     * A name for this session.
     * </pre>
     *
     * <code>optional string name = 5;</code>
     * @return Whether the name field is set.
     */
    boolean hasName();
    /**
     * <pre>
     * A name for this session.
     * </pre>
     *
     * <code>optional string name = 5;</code>
     * @return The name.
     */
    java.lang.String getName();
    /**
     * <pre>
     * A name for this session.
     * </pre>
     *
     * <code>optional string name = 5;</code>
     * @return The bytes for name.
     */
    com.google.protobuf.ByteString
        getNameBytes();

    /**
     * <pre>
     * The slugified name of this session.
     * </pre>
     *
     * <code>optional string slug = 6 [deprecated = true];</code>
     * @deprecated
     * @return Whether the slug field is set.
     */
    @java.lang.Deprecated boolean hasSlug();
    /**
     * <pre>
     * The slugified name of this session.
     * </pre>
     *
     * <code>optional string slug = 6 [deprecated = true];</code>
     * @deprecated
     * @return The slug.
     */
    @java.lang.Deprecated java.lang.String getSlug();
    /**
     * <pre>
     * The slugified name of this session.
     * </pre>
     *
     * <code>optional string slug = 6 [deprecated = true];</code>
     * @deprecated
     * @return The bytes for slug.
     */
    @java.lang.Deprecated com.google.protobuf.ByteString
        getSlugBytes();

    /**
     * <pre>
     * Canonical URL for this object.
     * </pre>
     *
     * <code>optional string url = 7;</code>
     * @return Whether the url field is set.
     */
    boolean hasUrl();
    /**
     * <pre>
     * Canonical URL for this object.
     * </pre>
     *
     * <code>optional string url = 7;</code>
     * @return The url.
     */
    java.lang.String getUrl();
    /**
     * <pre>
     * Canonical URL for this object.
     * </pre>
     *
     * <code>optional string url = 7;</code>
     * @return The bytes for url.
     */
    com.google.protobuf.ByteString
        getUrlBytes();

    /**
     * <pre>
     * True if session is currently active.
     * </pre>
     *
     * <code>optional bool is_active = 8;</code>
     * @return Whether the isActive field is set.
     */
    boolean hasIsActive();
    /**
     * <pre>
     * True if session is currently active.
     * </pre>
     *
     * <code>optional bool is_active = 8;</code>
     * @return The isActive.
     */
    boolean getIsActive();
  }
  /**
   * <pre>
   * A session is a group of drinks occuring within the same time window.  Every
   * poured drink will be associated with exactly one session.
   * </pre>
   *
   * Protobuf type {@code Session}
   */
  public static final class Session extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:Session)
      SessionOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use Session.newBuilder() to construct.
    private Session(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private Session() {
      startTime_ = "";
      endTime_ = "";
      name_ = "";
      slug_ = "";
      url_ = "";
    }

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

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return org.kegbot.proto.Models.internal_static_Session_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return org.kegbot.proto.Models.internal_static_Session_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              org.kegbot.proto.Models.Session.class, org.kegbot.proto.Models.Session.Builder.class);
    }

    private int bitField0_;
    public static final int ID_FIELD_NUMBER = 1;
    private int id_;
    /**
     * <pre>
     * The unique identifier for this session.
     * </pre>
     *
     * <code>required uint32 id = 1;</code>
     * @return Whether the id field is set.
     */
    @java.lang.Override
    public boolean hasId() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <pre>
     * The unique identifier for this session.
     * </pre>
     *
     * <code>required uint32 id = 1;</code>
     * @return The id.
     */
    @java.lang.Override
    public int getId() {
      return id_;
    }

    public static final int START_TIME_FIELD_NUMBER = 2;
    private volatile java.lang.Object startTime_;
    /**
     * <pre>
     * The time this session was started, as an ISO8061 UTC timestamp.
     * </pre>
     *
     * <code>required string start_time = 2;</code>
     * @return Whether the startTime field is set.
     */
    @java.lang.Override
    public boolean hasStartTime() {
      return ((bitField0_ & 0x00000002) != 0);
    }
    /**
     * <pre>
     * The time this session was started, as an ISO8061 UTC timestamp.
     * </pre>
     *
     * <code>required string start_time = 2;</code>
     * @return The startTime.
     */
    @java.lang.Override
    public java.lang.String getStartTime() {
      java.lang.Object ref = startTime_;
      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()) {
          startTime_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * The time this session was started, as an ISO8061 UTC timestamp.
     * </pre>
     *
     * <code>required string start_time = 2;</code>
     * @return The bytes for startTime.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getStartTimeBytes() {
      java.lang.Object ref = startTime_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        startTime_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int END_TIME_FIELD_NUMBER = 3;
    private volatile java.lang.Object endTime_;
    /**
     * <pre>
     * The time this session ended, as an ISO8061 UTC timestamp.
     * </pre>
     *
     * <code>required string end_time = 3;</code>
     * @return Whether the endTime field is set.
     */
    @java.lang.Override
    public boolean hasEndTime() {
      return ((bitField0_ & 0x00000004) != 0);
    }
    /**
     * <pre>
     * The time this session ended, as an ISO8061 UTC timestamp.
     * </pre>
     *
     * <code>required string end_time = 3;</code>
     * @return The endTime.
     */
    @java.lang.Override
    public java.lang.String getEndTime() {
      java.lang.Object ref = endTime_;
      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()) {
          endTime_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * The time this session ended, as an ISO8061 UTC timestamp.
     * </pre>
     *
     * <code>required string end_time = 3;</code>
     * @return The bytes for endTime.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getEndTimeBytes() {
      java.lang.Object ref = endTime_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        endTime_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int VOLUME_ML_FIELD_NUMBER = 4;
    private double volumeMl_;
    /**
     * <pre>
     * Total volume poured during this session, in milliliters.
     * </pre>
     *
     * <code>required double volume_ml = 4;</code>
     * @return Whether the volumeMl field is set.
     */
    @java.lang.Override
    public boolean hasVolumeMl() {
      return ((bitField0_ & 0x00000008) != 0);
    }
    /**
     * <pre>
     * Total volume poured during this session, in milliliters.
     * </pre>
     *
     * <code>required double volume_ml = 4;</code>
     * @return The volumeMl.
     */
    @java.lang.Override
    public double getVolumeMl() {
      return volumeMl_;
    }

    public static final int NAME_FIELD_NUMBER = 5;
    private volatile java.lang.Object name_;
    /**
     * <pre>
     * A name for this session.
     * </pre>
     *
     * <code>optional string name = 5;</code>
     * @return Whether the name field is set.
     */
    @java.lang.Override
    public boolean hasName() {
      return ((bitField0_ & 0x00000010) != 0);
    }
    /**
     * <pre>
     * A name for this session.
     * </pre>
     *
     * <code>optional string name = 5;</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>
     * A name for this session.
     * </pre>
     *
     * <code>optional string name = 5;</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 SLUG_FIELD_NUMBER = 6;
    private volatile java.lang.Object slug_;
    /**
     * <pre>
     * The slugified name of this session.
     * </pre>
     *
     * <code>optional string slug = 6 [deprecated = true];</code>
     * @deprecated
     * @return Whether the slug field is set.
     */
    @java.lang.Override
    @java.lang.Deprecated public boolean hasSlug() {
      return ((bitField0_ & 0x00000020) != 0);
    }
    /**
     * <pre>
     * The slugified name of this session.
     * </pre>
     *
     * <code>optional string slug = 6 [deprecated = true];</code>
     * @deprecated
     * @return The slug.
     */
    @java.lang.Override
    @java.lang.Deprecated public java.lang.String getSlug() {
      java.lang.Object ref = slug_;
      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()) {
          slug_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * The slugified name of this session.
     * </pre>
     *
     * <code>optional string slug = 6 [deprecated = true];</code>
     * @deprecated
     * @return The bytes for slug.
     */
    @java.lang.Override
    @java.lang.Deprecated public com.google.protobuf.ByteString
        getSlugBytes() {
      java.lang.Object ref = slug_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        slug_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int URL_FIELD_NUMBER = 7;
    private volatile java.lang.Object url_;
    /**
     * <pre>
     * Canonical URL for this object.
     * </pre>
     *
     * <code>optional string url = 7;</code>
     * @return Whether the url field is set.
     */
    @java.lang.Override
    public boolean hasUrl() {
      return ((bitField0_ & 0x00000040) != 0);
    }
    /**
     * <pre>
     * Canonical URL for this object.
     * </pre>
     *
     * <code>optional string url = 7;</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>
     * Canonical URL for this object.
     * </pre>
     *
     * <code>optional string url = 7;</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 IS_ACTIVE_FIELD_NUMBER = 8;
    private boolean isActive_;
    /**
     * <pre>
     * True if session is currently active.
     * </pre>
     *
     * <code>optional bool is_active = 8;</code>
     * @return Whether the isActive field is set.
     */
    @java.lang.Override
    public boolean hasIsActive() {
      return ((bitField0_ & 0x00000080) != 0);
    }
    /**
     * <pre>
     * True if session is currently active.
     * </pre>
     *
     * <code>optional bool is_active = 8;</code>
     * @return The isActive.
     */
    @java.lang.Override
    public boolean getIsActive() {
      return isActive_;
    }

    public static org.kegbot.proto.Models.Session parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.Session parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.Session parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.Session parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.Session parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.Session parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.Session parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.Session 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 org.kegbot.proto.Models.Session parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.Session 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 org.kegbot.proto.Models.Session parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.Session 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(org.kegbot.proto.Models.Session 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 session is a group of drinks occuring within the same time window.  Every
     * poured drink will be associated with exactly one session.
     * </pre>
     *
     * Protobuf type {@code Session}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:Session)
        org.kegbot.proto.Models.SessionOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return org.kegbot.proto.Models.internal_static_Session_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return org.kegbot.proto.Models.internal_static_Session_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                org.kegbot.proto.Models.Session.class, org.kegbot.proto.Models.Session.Builder.class);
      }

      // Construct using org.kegbot.proto.Models.Session.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);
        startTime_ = "";
        bitField0_ = (bitField0_ & ~0x00000002);
        endTime_ = "";
        bitField0_ = (bitField0_ & ~0x00000004);
        volumeMl_ = 0D;
        bitField0_ = (bitField0_ & ~0x00000008);
        name_ = "";
        bitField0_ = (bitField0_ & ~0x00000010);
        slug_ = "";
        bitField0_ = (bitField0_ & ~0x00000020);
        url_ = "";
        bitField0_ = (bitField0_ & ~0x00000040);
        isActive_ = false;
        bitField0_ = (bitField0_ & ~0x00000080);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return org.kegbot.proto.Models.internal_static_Session_descriptor;
      }

      @java.lang.Override
      public org.kegbot.proto.Models.Session getDefaultInstanceForType() {
        return org.kegbot.proto.Models.Session.getDefaultInstance();
      }

      @java.lang.Override
      public org.kegbot.proto.Models.Session build() {
        org.kegbot.proto.Models.Session result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public org.kegbot.proto.Models.Session buildPartial() {
        org.kegbot.proto.Models.Session result = new org.kegbot.proto.Models.Session(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)) {
          to_bitField0_ |= 0x00000002;
        }
        result.startTime_ = startTime_;
        if (((from_bitField0_ & 0x00000004) != 0)) {
          to_bitField0_ |= 0x00000004;
        }
        result.endTime_ = endTime_;
        if (((from_bitField0_ & 0x00000008) != 0)) {
          result.volumeMl_ = volumeMl_;
          to_bitField0_ |= 0x00000008;
        }
        if (((from_bitField0_ & 0x00000010) != 0)) {
          to_bitField0_ |= 0x00000010;
        }
        result.name_ = name_;
        if (((from_bitField0_ & 0x00000020) != 0)) {
          to_bitField0_ |= 0x00000020;
        }
        result.slug_ = slug_;
        if (((from_bitField0_ & 0x00000040) != 0)) {
          to_bitField0_ |= 0x00000040;
        }
        result.url_ = url_;
        if (((from_bitField0_ & 0x00000080) != 0)) {
          result.isActive_ = isActive_;
          to_bitField0_ |= 0x00000080;
        }
        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);
      }
      private int bitField0_;

      private int id_ ;
      /**
       * <pre>
       * The unique identifier for this session.
       * </pre>
       *
       * <code>required uint32 id = 1;</code>
       * @return Whether the id field is set.
       */
      @java.lang.Override
      public boolean hasId() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <pre>
       * The unique identifier for this session.
       * </pre>
       *
       * <code>required uint32 id = 1;</code>
       * @return The id.
       */
      @java.lang.Override
      public int getId() {
        return id_;
      }
      /**
       * <pre>
       * The unique identifier for this session.
       * </pre>
       *
       * <code>required uint32 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>
       * The unique identifier for this session.
       * </pre>
       *
       * <code>required uint32 id = 1;</code>
       * @return This builder for chaining.
       */
      public Builder clearId() {
        bitField0_ = (bitField0_ & ~0x00000001);
        id_ = 0;
        onChanged();
        return this;
      }

      private java.lang.Object startTime_ = "";
      /**
       * <pre>
       * The time this session was started, as an ISO8061 UTC timestamp.
       * </pre>
       *
       * <code>required string start_time = 2;</code>
       * @return Whether the startTime field is set.
       */
      public boolean hasStartTime() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <pre>
       * The time this session was started, as an ISO8061 UTC timestamp.
       * </pre>
       *
       * <code>required string start_time = 2;</code>
       * @return The startTime.
       */
      public java.lang.String getStartTime() {
        java.lang.Object ref = startTime_;
        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()) {
            startTime_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * The time this session was started, as an ISO8061 UTC timestamp.
       * </pre>
       *
       * <code>required string start_time = 2;</code>
       * @return The bytes for startTime.
       */
      public com.google.protobuf.ByteString
          getStartTimeBytes() {
        java.lang.Object ref = startTime_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          startTime_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * The time this session was started, as an ISO8061 UTC timestamp.
       * </pre>
       *
       * <code>required string start_time = 2;</code>
       * @param value The startTime to set.
       * @return This builder for chaining.
       */
      public Builder setStartTime(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
        startTime_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The time this session was started, as an ISO8061 UTC timestamp.
       * </pre>
       *
       * <code>required string start_time = 2;</code>
       * @return This builder for chaining.
       */
      public Builder clearStartTime() {
        bitField0_ = (bitField0_ & ~0x00000002);
        startTime_ = getDefaultInstance().getStartTime();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The time this session was started, as an ISO8061 UTC timestamp.
       * </pre>
       *
       * <code>required string start_time = 2;</code>
       * @param value The bytes for startTime to set.
       * @return This builder for chaining.
       */
      public Builder setStartTimeBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
        startTime_ = value;
        onChanged();
        return this;
      }

      private java.lang.Object endTime_ = "";
      /**
       * <pre>
       * The time this session ended, as an ISO8061 UTC timestamp.
       * </pre>
       *
       * <code>required string end_time = 3;</code>
       * @return Whether the endTime field is set.
       */
      public boolean hasEndTime() {
        return ((bitField0_ & 0x00000004) != 0);
      }
      /**
       * <pre>
       * The time this session ended, as an ISO8061 UTC timestamp.
       * </pre>
       *
       * <code>required string end_time = 3;</code>
       * @return The endTime.
       */
      public java.lang.String getEndTime() {
        java.lang.Object ref = endTime_;
        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()) {
            endTime_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * The time this session ended, as an ISO8061 UTC timestamp.
       * </pre>
       *
       * <code>required string end_time = 3;</code>
       * @return The bytes for endTime.
       */
      public com.google.protobuf.ByteString
          getEndTimeBytes() {
        java.lang.Object ref = endTime_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          endTime_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * The time this session ended, as an ISO8061 UTC timestamp.
       * </pre>
       *
       * <code>required string end_time = 3;</code>
       * @param value The endTime to set.
       * @return This builder for chaining.
       */
      public Builder setEndTime(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
        endTime_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The time this session ended, as an ISO8061 UTC timestamp.
       * </pre>
       *
       * <code>required string end_time = 3;</code>
       * @return This builder for chaining.
       */
      public Builder clearEndTime() {
        bitField0_ = (bitField0_ & ~0x00000004);
        endTime_ = getDefaultInstance().getEndTime();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The time this session ended, as an ISO8061 UTC timestamp.
       * </pre>
       *
       * <code>required string end_time = 3;</code>
       * @param value The bytes for endTime to set.
       * @return This builder for chaining.
       */
      public Builder setEndTimeBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
        endTime_ = value;
        onChanged();
        return this;
      }

      private double volumeMl_ ;
      /**
       * <pre>
       * Total volume poured during this session, in milliliters.
       * </pre>
       *
       * <code>required double volume_ml = 4;</code>
       * @return Whether the volumeMl field is set.
       */
      @java.lang.Override
      public boolean hasVolumeMl() {
        return ((bitField0_ & 0x00000008) != 0);
      }
      /**
       * <pre>
       * Total volume poured during this session, in milliliters.
       * </pre>
       *
       * <code>required double volume_ml = 4;</code>
       * @return The volumeMl.
       */
      @java.lang.Override
      public double getVolumeMl() {
        return volumeMl_;
      }
      /**
       * <pre>
       * Total volume poured during this session, in milliliters.
       * </pre>
       *
       * <code>required double volume_ml = 4;</code>
       * @param value The volumeMl to set.
       * @return This builder for chaining.
       */
      public Builder setVolumeMl(double value) {
        bitField0_ |= 0x00000008;
        volumeMl_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Total volume poured during this session, in milliliters.
       * </pre>
       *
       * <code>required double volume_ml = 4;</code>
       * @return This builder for chaining.
       */
      public Builder clearVolumeMl() {
        bitField0_ = (bitField0_ & ~0x00000008);
        volumeMl_ = 0D;
        onChanged();
        return this;
      }

      private java.lang.Object name_ = "";
      /**
       * <pre>
       * A name for this session.
       * </pre>
       *
       * <code>optional string name = 5;</code>
       * @return Whether the name field is set.
       */
      public boolean hasName() {
        return ((bitField0_ & 0x00000010) != 0);
      }
      /**
       * <pre>
       * A name for this session.
       * </pre>
       *
       * <code>optional string name = 5;</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>
       * A name for this session.
       * </pre>
       *
       * <code>optional string name = 5;</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>
       * A name for this session.
       * </pre>
       *
       * <code>optional string name = 5;</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_ |= 0x00000010;
        name_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * A name for this session.
       * </pre>
       *
       * <code>optional string name = 5;</code>
       * @return This builder for chaining.
       */
      public Builder clearName() {
        bitField0_ = (bitField0_ & ~0x00000010);
        name_ = getDefaultInstance().getName();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * A name for this session.
       * </pre>
       *
       * <code>optional string name = 5;</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_ |= 0x00000010;
        name_ = value;
        onChanged();
        return this;
      }

      private java.lang.Object slug_ = "";
      /**
       * <pre>
       * The slugified name of this session.
       * </pre>
       *
       * <code>optional string slug = 6 [deprecated = true];</code>
       * @deprecated
       * @return Whether the slug field is set.
       */
      @java.lang.Deprecated public boolean hasSlug() {
        return ((bitField0_ & 0x00000020) != 0);
      }
      /**
       * <pre>
       * The slugified name of this session.
       * </pre>
       *
       * <code>optional string slug = 6 [deprecated = true];</code>
       * @deprecated
       * @return The slug.
       */
      @java.lang.Deprecated public java.lang.String getSlug() {
        java.lang.Object ref = slug_;
        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()) {
            slug_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * The slugified name of this session.
       * </pre>
       *
       * <code>optional string slug = 6 [deprecated = true];</code>
       * @deprecated
       * @return The bytes for slug.
       */
      @java.lang.Deprecated public com.google.protobuf.ByteString
          getSlugBytes() {
        java.lang.Object ref = slug_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          slug_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * The slugified name of this session.
       * </pre>
       *
       * <code>optional string slug = 6 [deprecated = true];</code>
       * @deprecated
       * @param value The slug to set.
       * @return This builder for chaining.
       */
      @java.lang.Deprecated public Builder setSlug(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000020;
        slug_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The slugified name of this session.
       * </pre>
       *
       * <code>optional string slug = 6 [deprecated = true];</code>
       * @deprecated
       * @return This builder for chaining.
       */
      @java.lang.Deprecated public Builder clearSlug() {
        bitField0_ = (bitField0_ & ~0x00000020);
        slug_ = getDefaultInstance().getSlug();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The slugified name of this session.
       * </pre>
       *
       * <code>optional string slug = 6 [deprecated = true];</code>
       * @deprecated
       * @param value The bytes for slug to set.
       * @return This builder for chaining.
       */
      @java.lang.Deprecated public Builder setSlugBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000020;
        slug_ = value;
        onChanged();
        return this;
      }

      private java.lang.Object url_ = "";
      /**
       * <pre>
       * Canonical URL for this object.
       * </pre>
       *
       * <code>optional string url = 7;</code>
       * @return Whether the url field is set.
       */
      public boolean hasUrl() {
        return ((bitField0_ & 0x00000040) != 0);
      }
      /**
       * <pre>
       * Canonical URL for this object.
       * </pre>
       *
       * <code>optional string url = 7;</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>
       * Canonical URL for this object.
       * </pre>
       *
       * <code>optional string url = 7;</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>
       * Canonical URL for this object.
       * </pre>
       *
       * <code>optional string url = 7;</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_ |= 0x00000040;
        url_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Canonical URL for this object.
       * </pre>
       *
       * <code>optional string url = 7;</code>
       * @return This builder for chaining.
       */
      public Builder clearUrl() {
        bitField0_ = (bitField0_ & ~0x00000040);
        url_ = getDefaultInstance().getUrl();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Canonical URL for this object.
       * </pre>
       *
       * <code>optional string url = 7;</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_ |= 0x00000040;
        url_ = value;
        onChanged();
        return this;
      }

      private boolean isActive_ ;
      /**
       * <pre>
       * True if session is currently active.
       * </pre>
       *
       * <code>optional bool is_active = 8;</code>
       * @return Whether the isActive field is set.
       */
      @java.lang.Override
      public boolean hasIsActive() {
        return ((bitField0_ & 0x00000080) != 0);
      }
      /**
       * <pre>
       * True if session is currently active.
       * </pre>
       *
       * <code>optional bool is_active = 8;</code>
       * @return The isActive.
       */
      @java.lang.Override
      public boolean getIsActive() {
        return isActive_;
      }
      /**
       * <pre>
       * True if session is currently active.
       * </pre>
       *
       * <code>optional bool is_active = 8;</code>
       * @param value The isActive to set.
       * @return This builder for chaining.
       */
      public Builder setIsActive(boolean value) {
        bitField0_ |= 0x00000080;
        isActive_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * True if session is currently active.
       * </pre>
       *
       * <code>optional bool is_active = 8;</code>
       * @return This builder for chaining.
       */
      public Builder clearIsActive() {
        bitField0_ = (bitField0_ & ~0x00000080);
        isActive_ = 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:Session)
    }

    // @@protoc_insertion_point(class_scope:Session)
    private static final org.kegbot.proto.Models.Session DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new org.kegbot.proto.Models.Session();
    }

    public static org.kegbot.proto.Models.Session getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

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

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

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

    @java.lang.Override
    public org.kegbot.proto.Models.Session getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface ThermoLogOrBuilder extends
      // @@protoc_insertion_point(interface_extends:ThermoLog)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <pre>
     * The unique identifier for this log entry.
     * </pre>
     *
     * <code>required uint32 id = 1;</code>
     * @return Whether the id field is set.
     */
    boolean hasId();
    /**
     * <pre>
     * The unique identifier for this log entry.
     * </pre>
     *
     * <code>required uint32 id = 1;</code>
     * @return The id.
     */
    int getId();

    /**
     * <pre>
     * The sensor id that produced this log entry.
     * </pre>
     *
     * <code>required uint32 sensor_id = 2;</code>
     * @return Whether the sensorId field is set.
     */
    boolean hasSensorId();
    /**
     * <pre>
     * The sensor id that produced this log entry.
     * </pre>
     *
     * <code>required uint32 sensor_id = 2;</code>
     * @return The sensorId.
     */
    int getSensorId();

    /**
     * <pre>
     * The temperature, in degrees C.
     * </pre>
     *
     * <code>required double temperature_c = 3;</code>
     * @return Whether the temperatureC field is set.
     */
    boolean hasTemperatureC();
    /**
     * <pre>
     * The temperature, in degrees C.
     * </pre>
     *
     * <code>required double temperature_c = 3;</code>
     * @return The temperatureC.
     */
    double getTemperatureC();

    /**
     * <pre>
     * The recording date, as an ISO8061 UTC timestamp.
     * </pre>
     *
     * <code>required string time = 4;</code>
     * @return Whether the time field is set.
     */
    boolean hasTime();
    /**
     * <pre>
     * The recording date, as an ISO8061 UTC timestamp.
     * </pre>
     *
     * <code>required string time = 4;</code>
     * @return The time.
     */
    java.lang.String getTime();
    /**
     * <pre>
     * The recording date, as an ISO8061 UTC timestamp.
     * </pre>
     *
     * <code>required string time = 4;</code>
     * @return The bytes for time.
     */
    com.google.protobuf.ByteString
        getTimeBytes();
  }
  /**
   * <pre>
   * A log entry for a temperature sensor.
   * </pre>
   *
   * Protobuf type {@code ThermoLog}
   */
  public static final class ThermoLog extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:ThermoLog)
      ThermoLogOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use ThermoLog.newBuilder() to construct.
    private ThermoLog(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private ThermoLog() {
      time_ = "";
    }

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

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return org.kegbot.proto.Models.internal_static_ThermoLog_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return org.kegbot.proto.Models.internal_static_ThermoLog_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              org.kegbot.proto.Models.ThermoLog.class, org.kegbot.proto.Models.ThermoLog.Builder.class);
    }

    private int bitField0_;
    public static final int ID_FIELD_NUMBER = 1;
    private int id_;
    /**
     * <pre>
     * The unique identifier for this log entry.
     * </pre>
     *
     * <code>required uint32 id = 1;</code>
     * @return Whether the id field is set.
     */
    @java.lang.Override
    public boolean hasId() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <pre>
     * The unique identifier for this log entry.
     * </pre>
     *
     * <code>required uint32 id = 1;</code>
     * @return The id.
     */
    @java.lang.Override
    public int getId() {
      return id_;
    }

    public static final int SENSOR_ID_FIELD_NUMBER = 2;
    private int sensorId_;
    /**
     * <pre>
     * The sensor id that produced this log entry.
     * </pre>
     *
     * <code>required uint32 sensor_id = 2;</code>
     * @return Whether the sensorId field is set.
     */
    @java.lang.Override
    public boolean hasSensorId() {
      return ((bitField0_ & 0x00000002) != 0);
    }
    /**
     * <pre>
     * The sensor id that produced this log entry.
     * </pre>
     *
     * <code>required uint32 sensor_id = 2;</code>
     * @return The sensorId.
     */
    @java.lang.Override
    public int getSensorId() {
      return sensorId_;
    }

    public static final int TEMPERATURE_C_FIELD_NUMBER = 3;
    private double temperatureC_;
    /**
     * <pre>
     * The temperature, in degrees C.
     * </pre>
     *
     * <code>required double temperature_c = 3;</code>
     * @return Whether the temperatureC field is set.
     */
    @java.lang.Override
    public boolean hasTemperatureC() {
      return ((bitField0_ & 0x00000004) != 0);
    }
    /**
     * <pre>
     * The temperature, in degrees C.
     * </pre>
     *
     * <code>required double temperature_c = 3;</code>
     * @return The temperatureC.
     */
    @java.lang.Override
    public double getTemperatureC() {
      return temperatureC_;
    }

    public static final int TIME_FIELD_NUMBER = 4;
    private volatile java.lang.Object time_;
    /**
     * <pre>
     * The recording date, as an ISO8061 UTC timestamp.
     * </pre>
     *
     * <code>required string time = 4;</code>
     * @return Whether the time field is set.
     */
    @java.lang.Override
    public boolean hasTime() {
      return ((bitField0_ & 0x00000008) != 0);
    }
    /**
     * <pre>
     * The recording date, as an ISO8061 UTC timestamp.
     * </pre>
     *
     * <code>required string time = 4;</code>
     * @return The time.
     */
    @java.lang.Override
    public java.lang.String getTime() {
      java.lang.Object ref = time_;
      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()) {
          time_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * The recording date, as an ISO8061 UTC timestamp.
     * </pre>
     *
     * <code>required string time = 4;</code>
     * @return The bytes for time.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getTimeBytes() {
      java.lang.Object ref = time_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        time_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static org.kegbot.proto.Models.ThermoLog parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.ThermoLog parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.ThermoLog parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.ThermoLog parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.ThermoLog parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.ThermoLog parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.ThermoLog parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.ThermoLog 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 org.kegbot.proto.Models.ThermoLog parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.ThermoLog 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 org.kegbot.proto.Models.ThermoLog parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.ThermoLog 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(org.kegbot.proto.Models.ThermoLog 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 log entry for a temperature sensor.
     * </pre>
     *
     * Protobuf type {@code ThermoLog}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:ThermoLog)
        org.kegbot.proto.Models.ThermoLogOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return org.kegbot.proto.Models.internal_static_ThermoLog_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return org.kegbot.proto.Models.internal_static_ThermoLog_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                org.kegbot.proto.Models.ThermoLog.class, org.kegbot.proto.Models.ThermoLog.Builder.class);
      }

      // Construct using org.kegbot.proto.Models.ThermoLog.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);
        sensorId_ = 0;
        bitField0_ = (bitField0_ & ~0x00000002);
        temperatureC_ = 0D;
        bitField0_ = (bitField0_ & ~0x00000004);
        time_ = "";
        bitField0_ = (bitField0_ & ~0x00000008);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return org.kegbot.proto.Models.internal_static_ThermoLog_descriptor;
      }

      @java.lang.Override
      public org.kegbot.proto.Models.ThermoLog getDefaultInstanceForType() {
        return org.kegbot.proto.Models.ThermoLog.getDefaultInstance();
      }

      @java.lang.Override
      public org.kegbot.proto.Models.ThermoLog build() {
        org.kegbot.proto.Models.ThermoLog result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public org.kegbot.proto.Models.ThermoLog buildPartial() {
        org.kegbot.proto.Models.ThermoLog result = new org.kegbot.proto.Models.ThermoLog(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.sensorId_ = sensorId_;
          to_bitField0_ |= 0x00000002;
        }
        if (((from_bitField0_ & 0x00000004) != 0)) {
          result.temperatureC_ = temperatureC_;
          to_bitField0_ |= 0x00000004;
        }
        if (((from_bitField0_ & 0x00000008) != 0)) {
          to_bitField0_ |= 0x00000008;
        }
        result.time_ = time_;
        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);
      }
      private int bitField0_;

      private int id_ ;
      /**
       * <pre>
       * The unique identifier for this log entry.
       * </pre>
       *
       * <code>required uint32 id = 1;</code>
       * @return Whether the id field is set.
       */
      @java.lang.Override
      public boolean hasId() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <pre>
       * The unique identifier for this log entry.
       * </pre>
       *
       * <code>required uint32 id = 1;</code>
       * @return The id.
       */
      @java.lang.Override
      public int getId() {
        return id_;
      }
      /**
       * <pre>
       * The unique identifier for this log entry.
       * </pre>
       *
       * <code>required uint32 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>
       * The unique identifier for this log entry.
       * </pre>
       *
       * <code>required uint32 id = 1;</code>
       * @return This builder for chaining.
       */
      public Builder clearId() {
        bitField0_ = (bitField0_ & ~0x00000001);
        id_ = 0;
        onChanged();
        return this;
      }

      private int sensorId_ ;
      /**
       * <pre>
       * The sensor id that produced this log entry.
       * </pre>
       *
       * <code>required uint32 sensor_id = 2;</code>
       * @return Whether the sensorId field is set.
       */
      @java.lang.Override
      public boolean hasSensorId() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <pre>
       * The sensor id that produced this log entry.
       * </pre>
       *
       * <code>required uint32 sensor_id = 2;</code>
       * @return The sensorId.
       */
      @java.lang.Override
      public int getSensorId() {
        return sensorId_;
      }
      /**
       * <pre>
       * The sensor id that produced this log entry.
       * </pre>
       *
       * <code>required uint32 sensor_id = 2;</code>
       * @param value The sensorId to set.
       * @return This builder for chaining.
       */
      public Builder setSensorId(int value) {
        bitField0_ |= 0x00000002;
        sensorId_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The sensor id that produced this log entry.
       * </pre>
       *
       * <code>required uint32 sensor_id = 2;</code>
       * @return This builder for chaining.
       */
      public Builder clearSensorId() {
        bitField0_ = (bitField0_ & ~0x00000002);
        sensorId_ = 0;
        onChanged();
        return this;
      }

      private double temperatureC_ ;
      /**
       * <pre>
       * The temperature, in degrees C.
       * </pre>
       *
       * <code>required double temperature_c = 3;</code>
       * @return Whether the temperatureC field is set.
       */
      @java.lang.Override
      public boolean hasTemperatureC() {
        return ((bitField0_ & 0x00000004) != 0);
      }
      /**
       * <pre>
       * The temperature, in degrees C.
       * </pre>
       *
       * <code>required double temperature_c = 3;</code>
       * @return The temperatureC.
       */
      @java.lang.Override
      public double getTemperatureC() {
        return temperatureC_;
      }
      /**
       * <pre>
       * The temperature, in degrees C.
       * </pre>
       *
       * <code>required double temperature_c = 3;</code>
       * @param value The temperatureC to set.
       * @return This builder for chaining.
       */
      public Builder setTemperatureC(double value) {
        bitField0_ |= 0x00000004;
        temperatureC_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The temperature, in degrees C.
       * </pre>
       *
       * <code>required double temperature_c = 3;</code>
       * @return This builder for chaining.
       */
      public Builder clearTemperatureC() {
        bitField0_ = (bitField0_ & ~0x00000004);
        temperatureC_ = 0D;
        onChanged();
        return this;
      }

      private java.lang.Object time_ = "";
      /**
       * <pre>
       * The recording date, as an ISO8061 UTC timestamp.
       * </pre>
       *
       * <code>required string time = 4;</code>
       * @return Whether the time field is set.
       */
      public boolean hasTime() {
        return ((bitField0_ & 0x00000008) != 0);
      }
      /**
       * <pre>
       * The recording date, as an ISO8061 UTC timestamp.
       * </pre>
       *
       * <code>required string time = 4;</code>
       * @return The time.
       */
      public java.lang.String getTime() {
        java.lang.Object ref = time_;
        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()) {
            time_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * The recording date, as an ISO8061 UTC timestamp.
       * </pre>
       *
       * <code>required string time = 4;</code>
       * @return The bytes for time.
       */
      public com.google.protobuf.ByteString
          getTimeBytes() {
        java.lang.Object ref = time_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          time_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * The recording date, as an ISO8061 UTC timestamp.
       * </pre>
       *
       * <code>required string time = 4;</code>
       * @param value The time to set.
       * @return This builder for chaining.
       */
      public Builder setTime(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
        time_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The recording date, as an ISO8061 UTC timestamp.
       * </pre>
       *
       * <code>required string time = 4;</code>
       * @return This builder for chaining.
       */
      public Builder clearTime() {
        bitField0_ = (bitField0_ & ~0x00000008);
        time_ = getDefaultInstance().getTime();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The recording date, as an ISO8061 UTC timestamp.
       * </pre>
       *
       * <code>required string time = 4;</code>
       * @param value The bytes for time to set.
       * @return This builder for chaining.
       */
      public Builder setTimeBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
        time_ = 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:ThermoLog)
    }

    // @@protoc_insertion_point(class_scope:ThermoLog)
    private static final org.kegbot.proto.Models.ThermoLog DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new org.kegbot.proto.Models.ThermoLog();
    }

    public static org.kegbot.proto.Models.ThermoLog getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

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

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

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

    @java.lang.Override
    public org.kegbot.proto.Models.ThermoLog getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface ThermoSensorOrBuilder extends
      // @@protoc_insertion_point(interface_extends:ThermoSensor)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <pre>
     * The unique identifier for this temperature sensor.
     * </pre>
     *
     * <code>required uint32 id = 1;</code>
     * @return Whether the id field is set.
     */
    boolean hasId();
    /**
     * <pre>
     * The unique identifier for this temperature sensor.
     * </pre>
     *
     * <code>required uint32 id = 1;</code>
     * @return The id.
     */
    int getId();

    /**
     * <pre>
     * The raw/unique name of the sensor.
     * </pre>
     *
     * <code>required string sensor_name = 2;</code>
     * @return Whether the sensorName field is set.
     */
    boolean hasSensorName();
    /**
     * <pre>
     * The raw/unique name of the sensor.
     * </pre>
     *
     * <code>required string sensor_name = 2;</code>
     * @return The sensorName.
     */
    java.lang.String getSensorName();
    /**
     * <pre>
     * The raw/unique name of the sensor.
     * </pre>
     *
     * <code>required string sensor_name = 2;</code>
     * @return The bytes for sensorName.
     */
    com.google.protobuf.ByteString
        getSensorNameBytes();

    /**
     * <pre>
     * The friendly name for the sensor.
     * </pre>
     *
     * <code>optional string nice_name = 3;</code>
     * @return Whether the niceName field is set.
     */
    boolean hasNiceName();
    /**
     * <pre>
     * The friendly name for the sensor.
     * </pre>
     *
     * <code>optional string nice_name = 3;</code>
     * @return The niceName.
     */
    java.lang.String getNiceName();
    /**
     * <pre>
     * The friendly name for the sensor.
     * </pre>
     *
     * <code>optional string nice_name = 3;</code>
     * @return The bytes for niceName.
     */
    com.google.protobuf.ByteString
        getNiceNameBytes();

    /**
     * <pre>
     * The most recent recording for this sensor.
     * </pre>
     *
     * <code>optional .ThermoLog last_log = 6;</code>
     * @return Whether the lastLog field is set.
     */
    boolean hasLastLog();
    /**
     * <pre>
     * The most recent recording for this sensor.
     * </pre>
     *
     * <code>optional .ThermoLog last_log = 6;</code>
     * @return The lastLog.
     */
    org.kegbot.proto.Models.ThermoLog getLastLog();
    /**
     * <pre>
     * The most recent recording for this sensor.
     * </pre>
     *
     * <code>optional .ThermoLog last_log = 6;</code>
     */
    org.kegbot.proto.Models.ThermoLogOrBuilder getLastLogOrBuilder();

    /**
     * <code>optional double last_temp = 4 [deprecated = true];</code>
     * @deprecated
     * @return Whether the lastTemp field is set.
     */
    @java.lang.Deprecated boolean hasLastTemp();
    /**
     * <code>optional double last_temp = 4 [deprecated = true];</code>
     * @deprecated
     * @return The lastTemp.
     */
    @java.lang.Deprecated double getLastTemp();

    /**
     * <code>optional string last_time = 5 [deprecated = true];</code>
     * @deprecated
     * @return Whether the lastTime field is set.
     */
    @java.lang.Deprecated boolean hasLastTime();
    /**
     * <code>optional string last_time = 5 [deprecated = true];</code>
     * @deprecated
     * @return The lastTime.
     */
    @java.lang.Deprecated java.lang.String getLastTime();
    /**
     * <code>optional string last_time = 5 [deprecated = true];</code>
     * @deprecated
     * @return The bytes for lastTime.
     */
    @java.lang.Deprecated com.google.protobuf.ByteString
        getLastTimeBytes();
  }
  /**
   * <pre>
   * A temperature sensor configured in the system.
   * </pre>
   *
   * Protobuf type {@code ThermoSensor}
   */
  public static final class ThermoSensor extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:ThermoSensor)
      ThermoSensorOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use ThermoSensor.newBuilder() to construct.
    private ThermoSensor(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private ThermoSensor() {
      sensorName_ = "";
      niceName_ = "";
      lastTime_ = "";
    }

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

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return org.kegbot.proto.Models.internal_static_ThermoSensor_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return org.kegbot.proto.Models.internal_static_ThermoSensor_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              org.kegbot.proto.Models.ThermoSensor.class, org.kegbot.proto.Models.ThermoSensor.Builder.class);
    }

    private int bitField0_;
    public static final int ID_FIELD_NUMBER = 1;
    private int id_;
    /**
     * <pre>
     * The unique identifier for this temperature sensor.
     * </pre>
     *
     * <code>required uint32 id = 1;</code>
     * @return Whether the id field is set.
     */
    @java.lang.Override
    public boolean hasId() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <pre>
     * The unique identifier for this temperature sensor.
     * </pre>
     *
     * <code>required uint32 id = 1;</code>
     * @return The id.
     */
    @java.lang.Override
    public int getId() {
      return id_;
    }

    public static final int SENSOR_NAME_FIELD_NUMBER = 2;
    private volatile java.lang.Object sensorName_;
    /**
     * <pre>
     * The raw/unique name of the sensor.
     * </pre>
     *
     * <code>required string sensor_name = 2;</code>
     * @return Whether the sensorName field is set.
     */
    @java.lang.Override
    public boolean hasSensorName() {
      return ((bitField0_ & 0x00000002) != 0);
    }
    /**
     * <pre>
     * The raw/unique name of the sensor.
     * </pre>
     *
     * <code>required string sensor_name = 2;</code>
     * @return The sensorName.
     */
    @java.lang.Override
    public java.lang.String getSensorName() {
      java.lang.Object ref = sensorName_;
      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()) {
          sensorName_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * The raw/unique name of the sensor.
     * </pre>
     *
     * <code>required string sensor_name = 2;</code>
     * @return The bytes for sensorName.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getSensorNameBytes() {
      java.lang.Object ref = sensorName_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        sensorName_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int NICE_NAME_FIELD_NUMBER = 3;
    private volatile java.lang.Object niceName_;
    /**
     * <pre>
     * The friendly name for the sensor.
     * </pre>
     *
     * <code>optional string nice_name = 3;</code>
     * @return Whether the niceName field is set.
     */
    @java.lang.Override
    public boolean hasNiceName() {
      return ((bitField0_ & 0x00000004) != 0);
    }
    /**
     * <pre>
     * The friendly name for the sensor.
     * </pre>
     *
     * <code>optional string nice_name = 3;</code>
     * @return The niceName.
     */
    @java.lang.Override
    public java.lang.String getNiceName() {
      java.lang.Object ref = niceName_;
      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()) {
          niceName_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * The friendly name for the sensor.
     * </pre>
     *
     * <code>optional string nice_name = 3;</code>
     * @return The bytes for niceName.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getNiceNameBytes() {
      java.lang.Object ref = niceName_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        niceName_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int LAST_LOG_FIELD_NUMBER = 6;
    private org.kegbot.proto.Models.ThermoLog lastLog_;
    /**
     * <pre>
     * The most recent recording for this sensor.
     * </pre>
     *
     * <code>optional .ThermoLog last_log = 6;</code>
     * @return Whether the lastLog field is set.
     */
    @java.lang.Override
    public boolean hasLastLog() {
      return ((bitField0_ & 0x00000008) != 0);
    }
    /**
     * <pre>
     * The most recent recording for this sensor.
     * </pre>
     *
     * <code>optional .ThermoLog last_log = 6;</code>
     * @return The lastLog.
     */
    @java.lang.Override
    public org.kegbot.proto.Models.ThermoLog getLastLog() {
      return lastLog_ == null ? org.kegbot.proto.Models.ThermoLog.getDefaultInstance() : lastLog_;
    }
    /**
     * <pre>
     * The most recent recording for this sensor.
     * </pre>
     *
     * <code>optional .ThermoLog last_log = 6;</code>
     */
    @java.lang.Override
    public org.kegbot.proto.Models.ThermoLogOrBuilder getLastLogOrBuilder() {
      return lastLog_ == null ? org.kegbot.proto.Models.ThermoLog.getDefaultInstance() : lastLog_;
    }

    public static final int LAST_TEMP_FIELD_NUMBER = 4;
    private double lastTemp_;
    /**
     * <code>optional double last_temp = 4 [deprecated = true];</code>
     * @deprecated
     * @return Whether the lastTemp field is set.
     */
    @java.lang.Override
    @java.lang.Deprecated public boolean hasLastTemp() {
      return ((bitField0_ & 0x00000010) != 0);
    }
    /**
     * <code>optional double last_temp = 4 [deprecated = true];</code>
     * @deprecated
     * @return The lastTemp.
     */
    @java.lang.Override
    @java.lang.Deprecated public double getLastTemp() {
      return lastTemp_;
    }

    public static final int LAST_TIME_FIELD_NUMBER = 5;
    private volatile java.lang.Object lastTime_;
    /**
     * <code>optional string last_time = 5 [deprecated = true];</code>
     * @deprecated
     * @return Whether the lastTime field is set.
     */
    @java.lang.Override
    @java.lang.Deprecated public boolean hasLastTime() {
      return ((bitField0_ & 0x00000020) != 0);
    }
    /**
     * <code>optional string last_time = 5 [deprecated = true];</code>
     * @deprecated
     * @return The lastTime.
     */
    @java.lang.Override
    @java.lang.Deprecated public java.lang.String getLastTime() {
      java.lang.Object ref = lastTime_;
      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()) {
          lastTime_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string last_time = 5 [deprecated = true];</code>
     * @deprecated
     * @return The bytes for lastTime.
     */
    @java.lang.Override
    @java.lang.Deprecated public com.google.protobuf.ByteString
        getLastTimeBytes() {
      java.lang.Object ref = lastTime_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        lastTime_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static org.kegbot.proto.Models.ThermoSensor parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.ThermoSensor parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.ThermoSensor parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.ThermoSensor parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.ThermoSensor parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.ThermoSensor parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.ThermoSensor parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.ThermoSensor 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 org.kegbot.proto.Models.ThermoSensor parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.ThermoSensor 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 org.kegbot.proto.Models.ThermoSensor parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.ThermoSensor 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(org.kegbot.proto.Models.ThermoSensor 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 temperature sensor configured in the system.
     * </pre>
     *
     * Protobuf type {@code ThermoSensor}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:ThermoSensor)
        org.kegbot.proto.Models.ThermoSensorOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return org.kegbot.proto.Models.internal_static_ThermoSensor_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return org.kegbot.proto.Models.internal_static_ThermoSensor_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                org.kegbot.proto.Models.ThermoSensor.class, org.kegbot.proto.Models.ThermoSensor.Builder.class);
      }

      // Construct using org.kegbot.proto.Models.ThermoSensor.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
          getLastLogFieldBuilder();
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        id_ = 0;
        bitField0_ = (bitField0_ & ~0x00000001);
        sensorName_ = "";
        bitField0_ = (bitField0_ & ~0x00000002);
        niceName_ = "";
        bitField0_ = (bitField0_ & ~0x00000004);
        if (lastLogBuilder_ == null) {
          lastLog_ = null;
        } else {
          lastLogBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000008);
        lastTemp_ = 0D;
        bitField0_ = (bitField0_ & ~0x00000010);
        lastTime_ = "";
        bitField0_ = (bitField0_ & ~0x00000020);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return org.kegbot.proto.Models.internal_static_ThermoSensor_descriptor;
      }

      @java.lang.Override
      public org.kegbot.proto.Models.ThermoSensor getDefaultInstanceForType() {
        return org.kegbot.proto.Models.ThermoSensor.getDefaultInstance();
      }

      @java.lang.Override
      public org.kegbot.proto.Models.ThermoSensor build() {
        org.kegbot.proto.Models.ThermoSensor result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public org.kegbot.proto.Models.ThermoSensor buildPartial() {
        org.kegbot.proto.Models.ThermoSensor result = new org.kegbot.proto.Models.ThermoSensor(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)) {
          to_bitField0_ |= 0x00000002;
        }
        result.sensorName_ = sensorName_;
        if (((from_bitField0_ & 0x00000004) != 0)) {
          to_bitField0_ |= 0x00000004;
        }
        result.niceName_ = niceName_;
        if (((from_bitField0_ & 0x00000008) != 0)) {
          if (lastLogBuilder_ == null) {
            result.lastLog_ = lastLog_;
          } else {
            result.lastLog_ = lastLogBuilder_.build();
          }
          to_bitField0_ |= 0x00000008;
        }
        if (((from_bitField0_ & 0x00000010) != 0)) {
          result.lastTemp_ = lastTemp_;
          to_bitField0_ |= 0x00000010;
        }
        if (((from_bitField0_ & 0x00000020) != 0)) {
          to_bitField0_ |= 0x00000020;
        }
        result.lastTime_ = lastTime_;
        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);
      }
      private int bitField0_;

      private int id_ ;
      /**
       * <pre>
       * The unique identifier for this temperature sensor.
       * </pre>
       *
       * <code>required uint32 id = 1;</code>
       * @return Whether the id field is set.
       */
      @java.lang.Override
      public boolean hasId() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <pre>
       * The unique identifier for this temperature sensor.
       * </pre>
       *
       * <code>required uint32 id = 1;</code>
       * @return The id.
       */
      @java.lang.Override
      public int getId() {
        return id_;
      }
      /**
       * <pre>
       * The unique identifier for this temperature sensor.
       * </pre>
       *
       * <code>required uint32 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>
       * The unique identifier for this temperature sensor.
       * </pre>
       *
       * <code>required uint32 id = 1;</code>
       * @return This builder for chaining.
       */
      public Builder clearId() {
        bitField0_ = (bitField0_ & ~0x00000001);
        id_ = 0;
        onChanged();
        return this;
      }

      private java.lang.Object sensorName_ = "";
      /**
       * <pre>
       * The raw/unique name of the sensor.
       * </pre>
       *
       * <code>required string sensor_name = 2;</code>
       * @return Whether the sensorName field is set.
       */
      public boolean hasSensorName() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <pre>
       * The raw/unique name of the sensor.
       * </pre>
       *
       * <code>required string sensor_name = 2;</code>
       * @return The sensorName.
       */
      public java.lang.String getSensorName() {
        java.lang.Object ref = sensorName_;
        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()) {
            sensorName_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * The raw/unique name of the sensor.
       * </pre>
       *
       * <code>required string sensor_name = 2;</code>
       * @return The bytes for sensorName.
       */
      public com.google.protobuf.ByteString
          getSensorNameBytes() {
        java.lang.Object ref = sensorName_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          sensorName_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * The raw/unique name of the sensor.
       * </pre>
       *
       * <code>required string sensor_name = 2;</code>
       * @param value The sensorName to set.
       * @return This builder for chaining.
       */
      public Builder setSensorName(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
        sensorName_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The raw/unique name of the sensor.
       * </pre>
       *
       * <code>required string sensor_name = 2;</code>
       * @return This builder for chaining.
       */
      public Builder clearSensorName() {
        bitField0_ = (bitField0_ & ~0x00000002);
        sensorName_ = getDefaultInstance().getSensorName();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The raw/unique name of the sensor.
       * </pre>
       *
       * <code>required string sensor_name = 2;</code>
       * @param value The bytes for sensorName to set.
       * @return This builder for chaining.
       */
      public Builder setSensorNameBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
        sensorName_ = value;
        onChanged();
        return this;
      }

      private java.lang.Object niceName_ = "";
      /**
       * <pre>
       * The friendly name for the sensor.
       * </pre>
       *
       * <code>optional string nice_name = 3;</code>
       * @return Whether the niceName field is set.
       */
      public boolean hasNiceName() {
        return ((bitField0_ & 0x00000004) != 0);
      }
      /**
       * <pre>
       * The friendly name for the sensor.
       * </pre>
       *
       * <code>optional string nice_name = 3;</code>
       * @return The niceName.
       */
      public java.lang.String getNiceName() {
        java.lang.Object ref = niceName_;
        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()) {
            niceName_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * The friendly name for the sensor.
       * </pre>
       *
       * <code>optional string nice_name = 3;</code>
       * @return The bytes for niceName.
       */
      public com.google.protobuf.ByteString
          getNiceNameBytes() {
        java.lang.Object ref = niceName_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          niceName_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * The friendly name for the sensor.
       * </pre>
       *
       * <code>optional string nice_name = 3;</code>
       * @param value The niceName to set.
       * @return This builder for chaining.
       */
      public Builder setNiceName(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
        niceName_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The friendly name for the sensor.
       * </pre>
       *
       * <code>optional string nice_name = 3;</code>
       * @return This builder for chaining.
       */
      public Builder clearNiceName() {
        bitField0_ = (bitField0_ & ~0x00000004);
        niceName_ = getDefaultInstance().getNiceName();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The friendly name for the sensor.
       * </pre>
       *
       * <code>optional string nice_name = 3;</code>
       * @param value The bytes for niceName to set.
       * @return This builder for chaining.
       */
      public Builder setNiceNameBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
        niceName_ = value;
        onChanged();
        return this;
      }

      private org.kegbot.proto.Models.ThermoLog lastLog_;
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.ThermoLog, org.kegbot.proto.Models.ThermoLog.Builder, org.kegbot.proto.Models.ThermoLogOrBuilder> lastLogBuilder_;
      /**
       * <pre>
       * The most recent recording for this sensor.
       * </pre>
       *
       * <code>optional .ThermoLog last_log = 6;</code>
       * @return Whether the lastLog field is set.
       */
      public boolean hasLastLog() {
        return ((bitField0_ & 0x00000008) != 0);
      }
      /**
       * <pre>
       * The most recent recording for this sensor.
       * </pre>
       *
       * <code>optional .ThermoLog last_log = 6;</code>
       * @return The lastLog.
       */
      public org.kegbot.proto.Models.ThermoLog getLastLog() {
        if (lastLogBuilder_ == null) {
          return lastLog_ == null ? org.kegbot.proto.Models.ThermoLog.getDefaultInstance() : lastLog_;
        } else {
          return lastLogBuilder_.getMessage();
        }
      }
      /**
       * <pre>
       * The most recent recording for this sensor.
       * </pre>
       *
       * <code>optional .ThermoLog last_log = 6;</code>
       */
      public Builder setLastLog(org.kegbot.proto.Models.ThermoLog value) {
        if (lastLogBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          lastLog_ = value;
          onChanged();
        } else {
          lastLogBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000008;
        return this;
      }
      /**
       * <pre>
       * The most recent recording for this sensor.
       * </pre>
       *
       * <code>optional .ThermoLog last_log = 6;</code>
       */
      public Builder setLastLog(
          org.kegbot.proto.Models.ThermoLog.Builder builderForValue) {
        if (lastLogBuilder_ == null) {
          lastLog_ = builderForValue.build();
          onChanged();
        } else {
          lastLogBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000008;
        return this;
      }
      /**
       * <pre>
       * The most recent recording for this sensor.
       * </pre>
       *
       * <code>optional .ThermoLog last_log = 6;</code>
       */
      public Builder mergeLastLog(org.kegbot.proto.Models.ThermoLog value) {
        if (lastLogBuilder_ == null) {
          if (((bitField0_ & 0x00000008) != 0) &&
              lastLog_ != null &&
              lastLog_ != org.kegbot.proto.Models.ThermoLog.getDefaultInstance()) {
            lastLog_ =
              org.kegbot.proto.Models.ThermoLog.newBuilder(lastLog_).mergeFrom(value).buildPartial();
          } else {
            lastLog_ = value;
          }
          onChanged();
        } else {
          lastLogBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000008;
        return this;
      }
      /**
       * <pre>
       * The most recent recording for this sensor.
       * </pre>
       *
       * <code>optional .ThermoLog last_log = 6;</code>
       */
      public Builder clearLastLog() {
        if (lastLogBuilder_ == null) {
          lastLog_ = null;
          onChanged();
        } else {
          lastLogBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000008);
        return this;
      }
      /**
       * <pre>
       * The most recent recording for this sensor.
       * </pre>
       *
       * <code>optional .ThermoLog last_log = 6;</code>
       */
      public org.kegbot.proto.Models.ThermoLog.Builder getLastLogBuilder() {
        bitField0_ |= 0x00000008;
        onChanged();
        return getLastLogFieldBuilder().getBuilder();
      }
      /**
       * <pre>
       * The most recent recording for this sensor.
       * </pre>
       *
       * <code>optional .ThermoLog last_log = 6;</code>
       */
      public org.kegbot.proto.Models.ThermoLogOrBuilder getLastLogOrBuilder() {
        if (lastLogBuilder_ != null) {
          return lastLogBuilder_.getMessageOrBuilder();
        } else {
          return lastLog_ == null ?
              org.kegbot.proto.Models.ThermoLog.getDefaultInstance() : lastLog_;
        }
      }
      /**
       * <pre>
       * The most recent recording for this sensor.
       * </pre>
       *
       * <code>optional .ThermoLog last_log = 6;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.ThermoLog, org.kegbot.proto.Models.ThermoLog.Builder, org.kegbot.proto.Models.ThermoLogOrBuilder> 
          getLastLogFieldBuilder() {
        if (lastLogBuilder_ == null) {
          lastLogBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              org.kegbot.proto.Models.ThermoLog, org.kegbot.proto.Models.ThermoLog.Builder, org.kegbot.proto.Models.ThermoLogOrBuilder>(
                  getLastLog(),
                  getParentForChildren(),
                  isClean());
          lastLog_ = null;
        }
        return lastLogBuilder_;
      }

      private double lastTemp_ ;
      /**
       * <code>optional double last_temp = 4 [deprecated = true];</code>
       * @deprecated
       * @return Whether the lastTemp field is set.
       */
      @java.lang.Override
      @java.lang.Deprecated public boolean hasLastTemp() {
        return ((bitField0_ & 0x00000010) != 0);
      }
      /**
       * <code>optional double last_temp = 4 [deprecated = true];</code>
       * @deprecated
       * @return The lastTemp.
       */
      @java.lang.Override
      @java.lang.Deprecated public double getLastTemp() {
        return lastTemp_;
      }
      /**
       * <code>optional double last_temp = 4 [deprecated = true];</code>
       * @deprecated
       * @param value The lastTemp to set.
       * @return This builder for chaining.
       */
      @java.lang.Deprecated public Builder setLastTemp(double value) {
        bitField0_ |= 0x00000010;
        lastTemp_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional double last_temp = 4 [deprecated = true];</code>
       * @deprecated
       * @return This builder for chaining.
       */
      @java.lang.Deprecated public Builder clearLastTemp() {
        bitField0_ = (bitField0_ & ~0x00000010);
        lastTemp_ = 0D;
        onChanged();
        return this;
      }

      private java.lang.Object lastTime_ = "";
      /**
       * <code>optional string last_time = 5 [deprecated = true];</code>
       * @deprecated
       * @return Whether the lastTime field is set.
       */
      @java.lang.Deprecated public boolean hasLastTime() {
        return ((bitField0_ & 0x00000020) != 0);
      }
      /**
       * <code>optional string last_time = 5 [deprecated = true];</code>
       * @deprecated
       * @return The lastTime.
       */
      @java.lang.Deprecated public java.lang.String getLastTime() {
        java.lang.Object ref = lastTime_;
        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()) {
            lastTime_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string last_time = 5 [deprecated = true];</code>
       * @deprecated
       * @return The bytes for lastTime.
       */
      @java.lang.Deprecated public com.google.protobuf.ByteString
          getLastTimeBytes() {
        java.lang.Object ref = lastTime_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          lastTime_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string last_time = 5 [deprecated = true];</code>
       * @deprecated
       * @param value The lastTime to set.
       * @return This builder for chaining.
       */
      @java.lang.Deprecated public Builder setLastTime(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000020;
        lastTime_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string last_time = 5 [deprecated = true];</code>
       * @deprecated
       * @return This builder for chaining.
       */
      @java.lang.Deprecated public Builder clearLastTime() {
        bitField0_ = (bitField0_ & ~0x00000020);
        lastTime_ = getDefaultInstance().getLastTime();
        onChanged();
        return this;
      }
      /**
       * <code>optional string last_time = 5 [deprecated = true];</code>
       * @deprecated
       * @param value The bytes for lastTime to set.
       * @return This builder for chaining.
       */
      @java.lang.Deprecated public Builder setLastTimeBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000020;
        lastTime_ = 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:ThermoSensor)
    }

    // @@protoc_insertion_point(class_scope:ThermoSensor)
    private static final org.kegbot.proto.Models.ThermoSensor DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new org.kegbot.proto.Models.ThermoSensor();
    }

    public static org.kegbot.proto.Models.ThermoSensor getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

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

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

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

    @java.lang.Override
    public org.kegbot.proto.Models.ThermoSensor getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface UserOrBuilder extends
      // @@protoc_insertion_point(interface_extends:User)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <pre>
     * The user's unique username.
     * </pre>
     *
     * <code>required string username = 1;</code>
     * @return Whether the username field is set.
     */
    boolean hasUsername();
    /**
     * <pre>
     * The user's unique username.
     * </pre>
     *
     * <code>required string username = 1;</code>
     * @return The username.
     */
    java.lang.String getUsername();
    /**
     * <pre>
     * The user's unique username.
     * </pre>
     *
     * <code>required string username = 1;</code>
     * @return The bytes for username.
     */
    com.google.protobuf.ByteString
        getUsernameBytes();

    /**
     * <pre>
     * A non-unique "display" name, if available.
     * </pre>
     *
     * <code>optional string display_name = 13;</code>
     * @return Whether the displayName field is set.
     */
    boolean hasDisplayName();
    /**
     * <pre>
     * A non-unique "display" name, if available.
     * </pre>
     *
     * <code>optional string display_name = 13;</code>
     * @return The displayName.
     */
    java.lang.String getDisplayName();
    /**
     * <pre>
     * A non-unique "display" name, if available.
     * </pre>
     *
     * <code>optional string display_name = 13;</code>
     * @return The bytes for displayName.
     */
    com.google.protobuf.ByteString
        getDisplayNameBytes();

    /**
     * <pre>
     * The profile picture of the user.  May be unset if the user does not have a
     * profile picture.
     * </pre>
     *
     * <code>optional .Image image = 2;</code>
     * @return Whether the image field is set.
     */
    boolean hasImage();
    /**
     * <pre>
     * The profile picture of the user.  May be unset if the user does not have a
     * profile picture.
     * </pre>
     *
     * <code>optional .Image image = 2;</code>
     * @return The image.
     */
    org.kegbot.proto.Models.Image getImage();
    /**
     * <pre>
     * The profile picture of the user.  May be unset if the user does not have a
     * profile picture.
     * </pre>
     *
     * <code>optional .Image image = 2;</code>
     */
    org.kegbot.proto.Models.ImageOrBuilder getImageOrBuilder();

    /**
     * <pre>
     * True if the user is active.  This value will be false for accounts which
     * have been disabled by the admin.
     * </pre>
     *
     * <code>required bool is_active = 3 [default = true];</code>
     * @return Whether the isActive field is set.
     */
    boolean hasIsActive();
    /**
     * <pre>
     * True if the user is active.  This value will be false for accounts which
     * have been disabled by the admin.
     * </pre>
     *
     * <code>required bool is_active = 3 [default = true];</code>
     * @return The isActive.
     */
    boolean getIsActive();

    /**
     * <pre>
     * The first name of the user.
     * Not currently used.
     * </pre>
     *
     * <code>optional string first_name = 4;</code>
     * @return Whether the firstName field is set.
     */
    boolean hasFirstName();
    /**
     * <pre>
     * The first name of the user.
     * Not currently used.
     * </pre>
     *
     * <code>optional string first_name = 4;</code>
     * @return The firstName.
     */
    java.lang.String getFirstName();
    /**
     * <pre>
     * The first name of the user.
     * Not currently used.
     * </pre>
     *
     * <code>optional string first_name = 4;</code>
     * @return The bytes for firstName.
     */
    com.google.protobuf.ByteString
        getFirstNameBytes();

    /**
     * <pre>
     * The last name of the user.
     * Not currently used.
     * </pre>
     *
     * <code>optional string last_name = 5;</code>
     * @return Whether the lastName field is set.
     */
    boolean hasLastName();
    /**
     * <pre>
     * The last name of the user.
     * Not currently used.
     * </pre>
     *
     * <code>optional string last_name = 5;</code>
     * @return The lastName.
     */
    java.lang.String getLastName();
    /**
     * <pre>
     * The last name of the user.
     * Not currently used.
     * </pre>
     *
     * <code>optional string last_name = 5;</code>
     * @return The bytes for lastName.
     */
    com.google.protobuf.ByteString
        getLastNameBytes();

    /**
     * <pre>
     * The email address of the user.
     * Only available to admin users.
     * </pre>
     *
     * <code>optional string email = 6;</code>
     * @return Whether the email field is set.
     */
    boolean hasEmail();
    /**
     * <pre>
     * The email address of the user.
     * Only available to admin users.
     * </pre>
     *
     * <code>optional string email = 6;</code>
     * @return The email.
     */
    java.lang.String getEmail();
    /**
     * <pre>
     * The email address of the user.
     * Only available to admin users.
     * </pre>
     *
     * <code>optional string email = 6;</code>
     * @return The bytes for email.
     */
    com.google.protobuf.ByteString
        getEmailBytes();

    /**
     * <pre>
     * The password of the user.
     * Only available to admin users.
     * </pre>
     *
     * <code>optional string password = 7;</code>
     * @return Whether the password field is set.
     */
    boolean hasPassword();
    /**
     * <pre>
     * The password of the user.
     * Only available to admin users.
     * </pre>
     *
     * <code>optional string password = 7;</code>
     * @return The password.
     */
    java.lang.String getPassword();
    /**
     * <pre>
     * The password of the user.
     * Only available to admin users.
     * </pre>
     *
     * <code>optional string password = 7;</code>
     * @return The bytes for password.
     */
    com.google.protobuf.ByteString
        getPasswordBytes();

    /**
     * <pre>
     * True if the user is a member of the system's staff.
     * Only available to admin users.
     * </pre>
     *
     * <code>optional bool is_staff = 8;</code>
     * @return Whether the isStaff field is set.
     */
    boolean hasIsStaff();
    /**
     * <pre>
     * True if the user is a member of the system's staff.
     * Only available to admin users.
     * </pre>
     *
     * <code>optional bool is_staff = 8;</code>
     * @return The isStaff.
     */
    boolean getIsStaff();

    /**
     * <pre>
     * True if the user is an administrator.
     * Only available to admin users.
     * </pre>
     *
     * <code>optional bool is_superuser = 9;</code>
     * @return Whether the isSuperuser field is set.
     */
    boolean hasIsSuperuser();
    /**
     * <pre>
     * True if the user is an administrator.
     * Only available to admin users.
     * </pre>
     *
     * <code>optional bool is_superuser = 9;</code>
     * @return The isSuperuser.
     */
    boolean getIsSuperuser();

    /**
     * <pre>
     * UTC time for the user's last login, as ISO8061 string.
     * Only available to admin users.
     * </pre>
     *
     * <code>optional string last_login = 10;</code>
     * @return Whether the lastLogin field is set.
     */
    boolean hasLastLogin();
    /**
     * <pre>
     * UTC time for the user's last login, as ISO8061 string.
     * Only available to admin users.
     * </pre>
     *
     * <code>optional string last_login = 10;</code>
     * @return The lastLogin.
     */
    java.lang.String getLastLogin();
    /**
     * <pre>
     * UTC time for the user's last login, as ISO8061 string.
     * Only available to admin users.
     * </pre>
     *
     * <code>optional string last_login = 10;</code>
     * @return The bytes for lastLogin.
     */
    com.google.protobuf.ByteString
        getLastLoginBytes();

    /**
     * <pre>
     * UTC time for the user's registration, as ISO8061 string.
     * Only available to admin users.
     * </pre>
     *
     * <code>optional string date_joined = 11;</code>
     * @return Whether the dateJoined field is set.
     */
    boolean hasDateJoined();
    /**
     * <pre>
     * UTC time for the user's registration, as ISO8061 string.
     * Only available to admin users.
     * </pre>
     *
     * <code>optional string date_joined = 11;</code>
     * @return The dateJoined.
     */
    java.lang.String getDateJoined();
    /**
     * <pre>
     * UTC time for the user's registration, as ISO8061 string.
     * Only available to admin users.
     * </pre>
     *
     * <code>optional string date_joined = 11;</code>
     * @return The bytes for dateJoined.
     */
    com.google.protobuf.ByteString
        getDateJoinedBytes();

    /**
     * <pre>
     * Canonical URL for this object.
     * </pre>
     *
     * <code>optional string url = 12;</code>
     * @return Whether the url field is set.
     */
    boolean hasUrl();
    /**
     * <pre>
     * Canonical URL for this object.
     * </pre>
     *
     * <code>optional string url = 12;</code>
     * @return The url.
     */
    java.lang.String getUrl();
    /**
     * <pre>
     * Canonical URL for this object.
     * </pre>
     *
     * <code>optional string url = 12;</code>
     * @return The bytes for url.
     */
    com.google.protobuf.ByteString
        getUrlBytes();
  }
  /**
   * <pre>
   * A drinker registered in the kegbot system.
   * </pre>
   *
   * Protobuf type {@code User}
   */
  public static final class User extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:User)
      UserOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use User.newBuilder() to construct.
    private User(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private User() {
      username_ = "";
      displayName_ = "";
      isActive_ = true;
      firstName_ = "";
      lastName_ = "";
      email_ = "";
      password_ = "";
      lastLogin_ = "";
      dateJoined_ = "";
      url_ = "";
    }

    @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;
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return org.kegbot.proto.Models.internal_static_User_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return org.kegbot.proto.Models.internal_static_User_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              org.kegbot.proto.Models.User.class, org.kegbot.proto.Models.User.Builder.class);
    }

    private int bitField0_;
    public static final int USERNAME_FIELD_NUMBER = 1;
    private volatile java.lang.Object username_;
    /**
     * <pre>
     * The user's unique username.
     * </pre>
     *
     * <code>required string username = 1;</code>
     * @return Whether the username field is set.
     */
    @java.lang.Override
    public boolean hasUsername() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <pre>
     * The user's unique username.
     * </pre>
     *
     * <code>required string username = 1;</code>
     * @return The username.
     */
    @java.lang.Override
    public java.lang.String getUsername() {
      java.lang.Object ref = username_;
      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()) {
          username_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * The user's unique username.
     * </pre>
     *
     * <code>required string username = 1;</code>
     * @return The bytes for username.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getUsernameBytes() {
      java.lang.Object ref = username_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        username_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int DISPLAY_NAME_FIELD_NUMBER = 13;
    private volatile java.lang.Object displayName_;
    /**
     * <pre>
     * A non-unique "display" name, if available.
     * </pre>
     *
     * <code>optional string display_name = 13;</code>
     * @return Whether the displayName field is set.
     */
    @java.lang.Override
    public boolean hasDisplayName() {
      return ((bitField0_ & 0x00000002) != 0);
    }
    /**
     * <pre>
     * A non-unique "display" name, if available.
     * </pre>
     *
     * <code>optional string display_name = 13;</code>
     * @return The displayName.
     */
    @java.lang.Override
    public java.lang.String getDisplayName() {
      java.lang.Object ref = displayName_;
      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()) {
          displayName_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * A non-unique "display" name, if available.
     * </pre>
     *
     * <code>optional string display_name = 13;</code>
     * @return The bytes for displayName.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getDisplayNameBytes() {
      java.lang.Object ref = displayName_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        displayName_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int IMAGE_FIELD_NUMBER = 2;
    private org.kegbot.proto.Models.Image image_;
    /**
     * <pre>
     * The profile picture of the user.  May be unset if the user does not have a
     * profile picture.
     * </pre>
     *
     * <code>optional .Image image = 2;</code>
     * @return Whether the image field is set.
     */
    @java.lang.Override
    public boolean hasImage() {
      return ((bitField0_ & 0x00000004) != 0);
    }
    /**
     * <pre>
     * The profile picture of the user.  May be unset if the user does not have a
     * profile picture.
     * </pre>
     *
     * <code>optional .Image image = 2;</code>
     * @return The image.
     */
    @java.lang.Override
    public org.kegbot.proto.Models.Image getImage() {
      return image_ == null ? org.kegbot.proto.Models.Image.getDefaultInstance() : image_;
    }
    /**
     * <pre>
     * The profile picture of the user.  May be unset if the user does not have a
     * profile picture.
     * </pre>
     *
     * <code>optional .Image image = 2;</code>
     */
    @java.lang.Override
    public org.kegbot.proto.Models.ImageOrBuilder getImageOrBuilder() {
      return image_ == null ? org.kegbot.proto.Models.Image.getDefaultInstance() : image_;
    }

    public static final int IS_ACTIVE_FIELD_NUMBER = 3;
    private boolean isActive_;
    /**
     * <pre>
     * True if the user is active.  This value will be false for accounts which
     * have been disabled by the admin.
     * </pre>
     *
     * <code>required bool is_active = 3 [default = true];</code>
     * @return Whether the isActive field is set.
     */
    @java.lang.Override
    public boolean hasIsActive() {
      return ((bitField0_ & 0x00000008) != 0);
    }
    /**
     * <pre>
     * True if the user is active.  This value will be false for accounts which
     * have been disabled by the admin.
     * </pre>
     *
     * <code>required bool is_active = 3 [default = true];</code>
     * @return The isActive.
     */
    @java.lang.Override
    public boolean getIsActive() {
      return isActive_;
    }

    public static final int FIRST_NAME_FIELD_NUMBER = 4;
    private volatile java.lang.Object firstName_;
    /**
     * <pre>
     * The first name of the user.
     * Not currently used.
     * </pre>
     *
     * <code>optional string first_name = 4;</code>
     * @return Whether the firstName field is set.
     */
    @java.lang.Override
    public boolean hasFirstName() {
      return ((bitField0_ & 0x00000010) != 0);
    }
    /**
     * <pre>
     * The first name of the user.
     * Not currently used.
     * </pre>
     *
     * <code>optional string first_name = 4;</code>
     * @return The firstName.
     */
    @java.lang.Override
    public java.lang.String getFirstName() {
      java.lang.Object ref = firstName_;
      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()) {
          firstName_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * The first name of the user.
     * Not currently used.
     * </pre>
     *
     * <code>optional string first_name = 4;</code>
     * @return The bytes for firstName.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getFirstNameBytes() {
      java.lang.Object ref = firstName_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        firstName_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int LAST_NAME_FIELD_NUMBER = 5;
    private volatile java.lang.Object lastName_;
    /**
     * <pre>
     * The last name of the user.
     * Not currently used.
     * </pre>
     *
     * <code>optional string last_name = 5;</code>
     * @return Whether the lastName field is set.
     */
    @java.lang.Override
    public boolean hasLastName() {
      return ((bitField0_ & 0x00000020) != 0);
    }
    /**
     * <pre>
     * The last name of the user.
     * Not currently used.
     * </pre>
     *
     * <code>optional string last_name = 5;</code>
     * @return The lastName.
     */
    @java.lang.Override
    public java.lang.String getLastName() {
      java.lang.Object ref = lastName_;
      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()) {
          lastName_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * The last name of the user.
     * Not currently used.
     * </pre>
     *
     * <code>optional string last_name = 5;</code>
     * @return The bytes for lastName.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getLastNameBytes() {
      java.lang.Object ref = lastName_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        lastName_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int EMAIL_FIELD_NUMBER = 6;
    private volatile java.lang.Object email_;
    /**
     * <pre>
     * The email address of the user.
     * Only available to admin users.
     * </pre>
     *
     * <code>optional string email = 6;</code>
     * @return Whether the email field is set.
     */
    @java.lang.Override
    public boolean hasEmail() {
      return ((bitField0_ & 0x00000040) != 0);
    }
    /**
     * <pre>
     * The email address of the user.
     * Only available to admin users.
     * </pre>
     *
     * <code>optional string email = 6;</code>
     * @return The email.
     */
    @java.lang.Override
    public java.lang.String getEmail() {
      java.lang.Object ref = email_;
      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()) {
          email_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * The email address of the user.
     * Only available to admin users.
     * </pre>
     *
     * <code>optional string email = 6;</code>
     * @return The bytes for email.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getEmailBytes() {
      java.lang.Object ref = email_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        email_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int PASSWORD_FIELD_NUMBER = 7;
    private volatile java.lang.Object password_;
    /**
     * <pre>
     * The password of the user.
     * Only available to admin users.
     * </pre>
     *
     * <code>optional string password = 7;</code>
     * @return Whether the password field is set.
     */
    @java.lang.Override
    public boolean hasPassword() {
      return ((bitField0_ & 0x00000080) != 0);
    }
    /**
     * <pre>
     * The password of the user.
     * Only available to admin users.
     * </pre>
     *
     * <code>optional string password = 7;</code>
     * @return The password.
     */
    @java.lang.Override
    public java.lang.String getPassword() {
      java.lang.Object ref = password_;
      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()) {
          password_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * The password of the user.
     * Only available to admin users.
     * </pre>
     *
     * <code>optional string password = 7;</code>
     * @return The bytes for password.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getPasswordBytes() {
      java.lang.Object ref = password_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        password_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int IS_STAFF_FIELD_NUMBER = 8;
    private boolean isStaff_;
    /**
     * <pre>
     * True if the user is a member of the system's staff.
     * Only available to admin users.
     * </pre>
     *
     * <code>optional bool is_staff = 8;</code>
     * @return Whether the isStaff field is set.
     */
    @java.lang.Override
    public boolean hasIsStaff() {
      return ((bitField0_ & 0x00000100) != 0);
    }
    /**
     * <pre>
     * True if the user is a member of the system's staff.
     * Only available to admin users.
     * </pre>
     *
     * <code>optional bool is_staff = 8;</code>
     * @return The isStaff.
     */
    @java.lang.Override
    public boolean getIsStaff() {
      return isStaff_;
    }

    public static final int IS_SUPERUSER_FIELD_NUMBER = 9;
    private boolean isSuperuser_;
    /**
     * <pre>
     * True if the user is an administrator.
     * Only available to admin users.
     * </pre>
     *
     * <code>optional bool is_superuser = 9;</code>
     * @return Whether the isSuperuser field is set.
     */
    @java.lang.Override
    public boolean hasIsSuperuser() {
      return ((bitField0_ & 0x00000200) != 0);
    }
    /**
     * <pre>
     * True if the user is an administrator.
     * Only available to admin users.
     * </pre>
     *
     * <code>optional bool is_superuser = 9;</code>
     * @return The isSuperuser.
     */
    @java.lang.Override
    public boolean getIsSuperuser() {
      return isSuperuser_;
    }

    public static final int LAST_LOGIN_FIELD_NUMBER = 10;
    private volatile java.lang.Object lastLogin_;
    /**
     * <pre>
     * UTC time for the user's last login, as ISO8061 string.
     * Only available to admin users.
     * </pre>
     *
     * <code>optional string last_login = 10;</code>
     * @return Whether the lastLogin field is set.
     */
    @java.lang.Override
    public boolean hasLastLogin() {
      return ((bitField0_ & 0x00000400) != 0);
    }
    /**
     * <pre>
     * UTC time for the user's last login, as ISO8061 string.
     * Only available to admin users.
     * </pre>
     *
     * <code>optional string last_login = 10;</code>
     * @return The lastLogin.
     */
    @java.lang.Override
    public java.lang.String getLastLogin() {
      java.lang.Object ref = lastLogin_;
      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()) {
          lastLogin_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * UTC time for the user's last login, as ISO8061 string.
     * Only available to admin users.
     * </pre>
     *
     * <code>optional string last_login = 10;</code>
     * @return The bytes for lastLogin.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getLastLoginBytes() {
      java.lang.Object ref = lastLogin_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        lastLogin_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int DATE_JOINED_FIELD_NUMBER = 11;
    private volatile java.lang.Object dateJoined_;
    /**
     * <pre>
     * UTC time for the user's registration, as ISO8061 string.
     * Only available to admin users.
     * </pre>
     *
     * <code>optional string date_joined = 11;</code>
     * @return Whether the dateJoined field is set.
     */
    @java.lang.Override
    public boolean hasDateJoined() {
      return ((bitField0_ & 0x00000800) != 0);
    }
    /**
     * <pre>
     * UTC time for the user's registration, as ISO8061 string.
     * Only available to admin users.
     * </pre>
     *
     * <code>optional string date_joined = 11;</code>
     * @return The dateJoined.
     */
    @java.lang.Override
    public java.lang.String getDateJoined() {
      java.lang.Object ref = dateJoined_;
      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()) {
          dateJoined_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * UTC time for the user's registration, as ISO8061 string.
     * Only available to admin users.
     * </pre>
     *
     * <code>optional string date_joined = 11;</code>
     * @return The bytes for dateJoined.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getDateJoinedBytes() {
      java.lang.Object ref = dateJoined_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        dateJoined_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int URL_FIELD_NUMBER = 12;
    private volatile java.lang.Object url_;
    /**
     * <pre>
     * Canonical URL for this object.
     * </pre>
     *
     * <code>optional string url = 12;</code>
     * @return Whether the url field is set.
     */
    @java.lang.Override
    public boolean hasUrl() {
      return ((bitField0_ & 0x00001000) != 0);
    }
    /**
     * <pre>
     * Canonical URL for this object.
     * </pre>
     *
     * <code>optional string url = 12;</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>
     * Canonical URL for this object.
     * </pre>
     *
     * <code>optional string url = 12;</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 org.kegbot.proto.Models.User parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.User parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.User parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.User parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.User parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.User parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.User parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.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 org.kegbot.proto.Models.User parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.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 org.kegbot.proto.Models.User parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.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(org.kegbot.proto.Models.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>
     * A drinker registered in the kegbot system.
     * </pre>
     *
     * Protobuf type {@code User}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:User)
        org.kegbot.proto.Models.UserOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return org.kegbot.proto.Models.internal_static_User_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return org.kegbot.proto.Models.internal_static_User_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                org.kegbot.proto.Models.User.class, org.kegbot.proto.Models.User.Builder.class);
      }

      // Construct using org.kegbot.proto.Models.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) {
          getImageFieldBuilder();
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        username_ = "";
        bitField0_ = (bitField0_ & ~0x00000001);
        displayName_ = "";
        bitField0_ = (bitField0_ & ~0x00000002);
        if (imageBuilder_ == null) {
          image_ = null;
        } else {
          imageBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000004);
        isActive_ = true;
        bitField0_ = (bitField0_ & ~0x00000008);
        firstName_ = "";
        bitField0_ = (bitField0_ & ~0x00000010);
        lastName_ = "";
        bitField0_ = (bitField0_ & ~0x00000020);
        email_ = "";
        bitField0_ = (bitField0_ & ~0x00000040);
        password_ = "";
        bitField0_ = (bitField0_ & ~0x00000080);
        isStaff_ = false;
        bitField0_ = (bitField0_ & ~0x00000100);
        isSuperuser_ = false;
        bitField0_ = (bitField0_ & ~0x00000200);
        lastLogin_ = "";
        bitField0_ = (bitField0_ & ~0x00000400);
        dateJoined_ = "";
        bitField0_ = (bitField0_ & ~0x00000800);
        url_ = "";
        bitField0_ = (bitField0_ & ~0x00001000);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return org.kegbot.proto.Models.internal_static_User_descriptor;
      }

      @java.lang.Override
      public org.kegbot.proto.Models.User getDefaultInstanceForType() {
        return org.kegbot.proto.Models.User.getDefaultInstance();
      }

      @java.lang.Override
      public org.kegbot.proto.Models.User build() {
        org.kegbot.proto.Models.User result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public org.kegbot.proto.Models.User buildPartial() {
        org.kegbot.proto.Models.User result = new org.kegbot.proto.Models.User(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) != 0)) {
          to_bitField0_ |= 0x00000001;
        }
        result.username_ = username_;
        if (((from_bitField0_ & 0x00000002) != 0)) {
          to_bitField0_ |= 0x00000002;
        }
        result.displayName_ = displayName_;
        if (((from_bitField0_ & 0x00000004) != 0)) {
          if (imageBuilder_ == null) {
            result.image_ = image_;
          } else {
            result.image_ = imageBuilder_.build();
          }
          to_bitField0_ |= 0x00000004;
        }
        if (((from_bitField0_ & 0x00000008) != 0)) {
          to_bitField0_ |= 0x00000008;
        }
        result.isActive_ = isActive_;
        if (((from_bitField0_ & 0x00000010) != 0)) {
          to_bitField0_ |= 0x00000010;
        }
        result.firstName_ = firstName_;
        if (((from_bitField0_ & 0x00000020) != 0)) {
          to_bitField0_ |= 0x00000020;
        }
        result.lastName_ = lastName_;
        if (((from_bitField0_ & 0x00000040) != 0)) {
          to_bitField0_ |= 0x00000040;
        }
        result.email_ = email_;
        if (((from_bitField0_ & 0x00000080) != 0)) {
          to_bitField0_ |= 0x00000080;
        }
        result.password_ = password_;
        if (((from_bitField0_ & 0x00000100) != 0)) {
          result.isStaff_ = isStaff_;
          to_bitField0_ |= 0x00000100;
        }
        if (((from_bitField0_ & 0x00000200) != 0)) {
          result.isSuperuser_ = isSuperuser_;
          to_bitField0_ |= 0x00000200;
        }
        if (((from_bitField0_ & 0x00000400) != 0)) {
          to_bitField0_ |= 0x00000400;
        }
        result.lastLogin_ = lastLogin_;
        if (((from_bitField0_ & 0x00000800) != 0)) {
          to_bitField0_ |= 0x00000800;
        }
        result.dateJoined_ = dateJoined_;
        if (((from_bitField0_ & 0x00001000) != 0)) {
          to_bitField0_ |= 0x00001000;
        }
        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);
      }
      private int bitField0_;

      private java.lang.Object username_ = "";
      /**
       * <pre>
       * The user's unique username.
       * </pre>
       *
       * <code>required string username = 1;</code>
       * @return Whether the username field is set.
       */
      public boolean hasUsername() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <pre>
       * The user's unique username.
       * </pre>
       *
       * <code>required string username = 1;</code>
       * @return The username.
       */
      public java.lang.String getUsername() {
        java.lang.Object ref = username_;
        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()) {
            username_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * The user's unique username.
       * </pre>
       *
       * <code>required string username = 1;</code>
       * @return The bytes for username.
       */
      public com.google.protobuf.ByteString
          getUsernameBytes() {
        java.lang.Object ref = username_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          username_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * The user's unique username.
       * </pre>
       *
       * <code>required string username = 1;</code>
       * @param value The username to set.
       * @return This builder for chaining.
       */
      public Builder setUsername(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
        username_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The user's unique username.
       * </pre>
       *
       * <code>required string username = 1;</code>
       * @return This builder for chaining.
       */
      public Builder clearUsername() {
        bitField0_ = (bitField0_ & ~0x00000001);
        username_ = getDefaultInstance().getUsername();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The user's unique username.
       * </pre>
       *
       * <code>required string username = 1;</code>
       * @param value The bytes for username to set.
       * @return This builder for chaining.
       */
      public Builder setUsernameBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
        username_ = value;
        onChanged();
        return this;
      }

      private java.lang.Object displayName_ = "";
      /**
       * <pre>
       * A non-unique "display" name, if available.
       * </pre>
       *
       * <code>optional string display_name = 13;</code>
       * @return Whether the displayName field is set.
       */
      public boolean hasDisplayName() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <pre>
       * A non-unique "display" name, if available.
       * </pre>
       *
       * <code>optional string display_name = 13;</code>
       * @return The displayName.
       */
      public java.lang.String getDisplayName() {
        java.lang.Object ref = displayName_;
        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()) {
            displayName_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * A non-unique "display" name, if available.
       * </pre>
       *
       * <code>optional string display_name = 13;</code>
       * @return The bytes for displayName.
       */
      public com.google.protobuf.ByteString
          getDisplayNameBytes() {
        java.lang.Object ref = displayName_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          displayName_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * A non-unique "display" name, if available.
       * </pre>
       *
       * <code>optional string display_name = 13;</code>
       * @param value The displayName to set.
       * @return This builder for chaining.
       */
      public Builder setDisplayName(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
        displayName_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * A non-unique "display" name, if available.
       * </pre>
       *
       * <code>optional string display_name = 13;</code>
       * @return This builder for chaining.
       */
      public Builder clearDisplayName() {
        bitField0_ = (bitField0_ & ~0x00000002);
        displayName_ = getDefaultInstance().getDisplayName();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * A non-unique "display" name, if available.
       * </pre>
       *
       * <code>optional string display_name = 13;</code>
       * @param value The bytes for displayName to set.
       * @return This builder for chaining.
       */
      public Builder setDisplayNameBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
        displayName_ = value;
        onChanged();
        return this;
      }

      private org.kegbot.proto.Models.Image image_;
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.Image, org.kegbot.proto.Models.Image.Builder, org.kegbot.proto.Models.ImageOrBuilder> imageBuilder_;
      /**
       * <pre>
       * The profile picture of the user.  May be unset if the user does not have a
       * profile picture.
       * </pre>
       *
       * <code>optional .Image image = 2;</code>
       * @return Whether the image field is set.
       */
      public boolean hasImage() {
        return ((bitField0_ & 0x00000004) != 0);
      }
      /**
       * <pre>
       * The profile picture of the user.  May be unset if the user does not have a
       * profile picture.
       * </pre>
       *
       * <code>optional .Image image = 2;</code>
       * @return The image.
       */
      public org.kegbot.proto.Models.Image getImage() {
        if (imageBuilder_ == null) {
          return image_ == null ? org.kegbot.proto.Models.Image.getDefaultInstance() : image_;
        } else {
          return imageBuilder_.getMessage();
        }
      }
      /**
       * <pre>
       * The profile picture of the user.  May be unset if the user does not have a
       * profile picture.
       * </pre>
       *
       * <code>optional .Image image = 2;</code>
       */
      public Builder setImage(org.kegbot.proto.Models.Image value) {
        if (imageBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          image_ = value;
          onChanged();
        } else {
          imageBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000004;
        return this;
      }
      /**
       * <pre>
       * The profile picture of the user.  May be unset if the user does not have a
       * profile picture.
       * </pre>
       *
       * <code>optional .Image image = 2;</code>
       */
      public Builder setImage(
          org.kegbot.proto.Models.Image.Builder builderForValue) {
        if (imageBuilder_ == null) {
          image_ = builderForValue.build();
          onChanged();
        } else {
          imageBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000004;
        return this;
      }
      /**
       * <pre>
       * The profile picture of the user.  May be unset if the user does not have a
       * profile picture.
       * </pre>
       *
       * <code>optional .Image image = 2;</code>
       */
      public Builder mergeImage(org.kegbot.proto.Models.Image value) {
        if (imageBuilder_ == null) {
          if (((bitField0_ & 0x00000004) != 0) &&
              image_ != null &&
              image_ != org.kegbot.proto.Models.Image.getDefaultInstance()) {
            image_ =
              org.kegbot.proto.Models.Image.newBuilder(image_).mergeFrom(value).buildPartial();
          } else {
            image_ = value;
          }
          onChanged();
        } else {
          imageBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000004;
        return this;
      }
      /**
       * <pre>
       * The profile picture of the user.  May be unset if the user does not have a
       * profile picture.
       * </pre>
       *
       * <code>optional .Image image = 2;</code>
       */
      public Builder clearImage() {
        if (imageBuilder_ == null) {
          image_ = null;
          onChanged();
        } else {
          imageBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000004);
        return this;
      }
      /**
       * <pre>
       * The profile picture of the user.  May be unset if the user does not have a
       * profile picture.
       * </pre>
       *
       * <code>optional .Image image = 2;</code>
       */
      public org.kegbot.proto.Models.Image.Builder getImageBuilder() {
        bitField0_ |= 0x00000004;
        onChanged();
        return getImageFieldBuilder().getBuilder();
      }
      /**
       * <pre>
       * The profile picture of the user.  May be unset if the user does not have a
       * profile picture.
       * </pre>
       *
       * <code>optional .Image image = 2;</code>
       */
      public org.kegbot.proto.Models.ImageOrBuilder getImageOrBuilder() {
        if (imageBuilder_ != null) {
          return imageBuilder_.getMessageOrBuilder();
        } else {
          return image_ == null ?
              org.kegbot.proto.Models.Image.getDefaultInstance() : image_;
        }
      }
      /**
       * <pre>
       * The profile picture of the user.  May be unset if the user does not have a
       * profile picture.
       * </pre>
       *
       * <code>optional .Image image = 2;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.Image, org.kegbot.proto.Models.Image.Builder, org.kegbot.proto.Models.ImageOrBuilder> 
          getImageFieldBuilder() {
        if (imageBuilder_ == null) {
          imageBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              org.kegbot.proto.Models.Image, org.kegbot.proto.Models.Image.Builder, org.kegbot.proto.Models.ImageOrBuilder>(
                  getImage(),
                  getParentForChildren(),
                  isClean());
          image_ = null;
        }
        return imageBuilder_;
      }

      private boolean isActive_ = true;
      /**
       * <pre>
       * True if the user is active.  This value will be false for accounts which
       * have been disabled by the admin.
       * </pre>
       *
       * <code>required bool is_active = 3 [default = true];</code>
       * @return Whether the isActive field is set.
       */
      @java.lang.Override
      public boolean hasIsActive() {
        return ((bitField0_ & 0x00000008) != 0);
      }
      /**
       * <pre>
       * True if the user is active.  This value will be false for accounts which
       * have been disabled by the admin.
       * </pre>
       *
       * <code>required bool is_active = 3 [default = true];</code>
       * @return The isActive.
       */
      @java.lang.Override
      public boolean getIsActive() {
        return isActive_;
      }
      /**
       * <pre>
       * True if the user is active.  This value will be false for accounts which
       * have been disabled by the admin.
       * </pre>
       *
       * <code>required bool is_active = 3 [default = true];</code>
       * @param value The isActive to set.
       * @return This builder for chaining.
       */
      public Builder setIsActive(boolean value) {
        bitField0_ |= 0x00000008;
        isActive_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * True if the user is active.  This value will be false for accounts which
       * have been disabled by the admin.
       * </pre>
       *
       * <code>required bool is_active = 3 [default = true];</code>
       * @return This builder for chaining.
       */
      public Builder clearIsActive() {
        bitField0_ = (bitField0_ & ~0x00000008);
        isActive_ = true;
        onChanged();
        return this;
      }

      private java.lang.Object firstName_ = "";
      /**
       * <pre>
       * The first name of the user.
       * Not currently used.
       * </pre>
       *
       * <code>optional string first_name = 4;</code>
       * @return Whether the firstName field is set.
       */
      public boolean hasFirstName() {
        return ((bitField0_ & 0x00000010) != 0);
      }
      /**
       * <pre>
       * The first name of the user.
       * Not currently used.
       * </pre>
       *
       * <code>optional string first_name = 4;</code>
       * @return The firstName.
       */
      public java.lang.String getFirstName() {
        java.lang.Object ref = firstName_;
        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()) {
            firstName_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * The first name of the user.
       * Not currently used.
       * </pre>
       *
       * <code>optional string first_name = 4;</code>
       * @return The bytes for firstName.
       */
      public com.google.protobuf.ByteString
          getFirstNameBytes() {
        java.lang.Object ref = firstName_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          firstName_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * The first name of the user.
       * Not currently used.
       * </pre>
       *
       * <code>optional string first_name = 4;</code>
       * @param value The firstName to set.
       * @return This builder for chaining.
       */
      public Builder setFirstName(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
        firstName_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The first name of the user.
       * Not currently used.
       * </pre>
       *
       * <code>optional string first_name = 4;</code>
       * @return This builder for chaining.
       */
      public Builder clearFirstName() {
        bitField0_ = (bitField0_ & ~0x00000010);
        firstName_ = getDefaultInstance().getFirstName();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The first name of the user.
       * Not currently used.
       * </pre>
       *
       * <code>optional string first_name = 4;</code>
       * @param value The bytes for firstName to set.
       * @return This builder for chaining.
       */
      public Builder setFirstNameBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
        firstName_ = value;
        onChanged();
        return this;
      }

      private java.lang.Object lastName_ = "";
      /**
       * <pre>
       * The last name of the user.
       * Not currently used.
       * </pre>
       *
       * <code>optional string last_name = 5;</code>
       * @return Whether the lastName field is set.
       */
      public boolean hasLastName() {
        return ((bitField0_ & 0x00000020) != 0);
      }
      /**
       * <pre>
       * The last name of the user.
       * Not currently used.
       * </pre>
       *
       * <code>optional string last_name = 5;</code>
       * @return The lastName.
       */
      public java.lang.String getLastName() {
        java.lang.Object ref = lastName_;
        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()) {
            lastName_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * The last name of the user.
       * Not currently used.
       * </pre>
       *
       * <code>optional string last_name = 5;</code>
       * @return The bytes for lastName.
       */
      public com.google.protobuf.ByteString
          getLastNameBytes() {
        java.lang.Object ref = lastName_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          lastName_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * The last name of the user.
       * Not currently used.
       * </pre>
       *
       * <code>optional string last_name = 5;</code>
       * @param value The lastName to set.
       * @return This builder for chaining.
       */
      public Builder setLastName(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000020;
        lastName_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The last name of the user.
       * Not currently used.
       * </pre>
       *
       * <code>optional string last_name = 5;</code>
       * @return This builder for chaining.
       */
      public Builder clearLastName() {
        bitField0_ = (bitField0_ & ~0x00000020);
        lastName_ = getDefaultInstance().getLastName();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The last name of the user.
       * Not currently used.
       * </pre>
       *
       * <code>optional string last_name = 5;</code>
       * @param value The bytes for lastName to set.
       * @return This builder for chaining.
       */
      public Builder setLastNameBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000020;
        lastName_ = value;
        onChanged();
        return this;
      }

      private java.lang.Object email_ = "";
      /**
       * <pre>
       * The email address of the user.
       * Only available to admin users.
       * </pre>
       *
       * <code>optional string email = 6;</code>
       * @return Whether the email field is set.
       */
      public boolean hasEmail() {
        return ((bitField0_ & 0x00000040) != 0);
      }
      /**
       * <pre>
       * The email address of the user.
       * Only available to admin users.
       * </pre>
       *
       * <code>optional string email = 6;</code>
       * @return The email.
       */
      public java.lang.String getEmail() {
        java.lang.Object ref = email_;
        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()) {
            email_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * The email address of the user.
       * Only available to admin users.
       * </pre>
       *
       * <code>optional string email = 6;</code>
       * @return The bytes for email.
       */
      public com.google.protobuf.ByteString
          getEmailBytes() {
        java.lang.Object ref = email_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          email_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * The email address of the user.
       * Only available to admin users.
       * </pre>
       *
       * <code>optional string email = 6;</code>
       * @param value The email to set.
       * @return This builder for chaining.
       */
      public Builder setEmail(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000040;
        email_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The email address of the user.
       * Only available to admin users.
       * </pre>
       *
       * <code>optional string email = 6;</code>
       * @return This builder for chaining.
       */
      public Builder clearEmail() {
        bitField0_ = (bitField0_ & ~0x00000040);
        email_ = getDefaultInstance().getEmail();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The email address of the user.
       * Only available to admin users.
       * </pre>
       *
       * <code>optional string email = 6;</code>
       * @param value The bytes for email to set.
       * @return This builder for chaining.
       */
      public Builder setEmailBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000040;
        email_ = value;
        onChanged();
        return this;
      }

      private java.lang.Object password_ = "";
      /**
       * <pre>
       * The password of the user.
       * Only available to admin users.
       * </pre>
       *
       * <code>optional string password = 7;</code>
       * @return Whether the password field is set.
       */
      public boolean hasPassword() {
        return ((bitField0_ & 0x00000080) != 0);
      }
      /**
       * <pre>
       * The password of the user.
       * Only available to admin users.
       * </pre>
       *
       * <code>optional string password = 7;</code>
       * @return The password.
       */
      public java.lang.String getPassword() {
        java.lang.Object ref = password_;
        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()) {
            password_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * The password of the user.
       * Only available to admin users.
       * </pre>
       *
       * <code>optional string password = 7;</code>
       * @return The bytes for password.
       */
      public com.google.protobuf.ByteString
          getPasswordBytes() {
        java.lang.Object ref = password_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          password_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * The password of the user.
       * Only available to admin users.
       * </pre>
       *
       * <code>optional string password = 7;</code>
       * @param value The password to set.
       * @return This builder for chaining.
       */
      public Builder setPassword(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000080;
        password_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The password of the user.
       * Only available to admin users.
       * </pre>
       *
       * <code>optional string password = 7;</code>
       * @return This builder for chaining.
       */
      public Builder clearPassword() {
        bitField0_ = (bitField0_ & ~0x00000080);
        password_ = getDefaultInstance().getPassword();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The password of the user.
       * Only available to admin users.
       * </pre>
       *
       * <code>optional string password = 7;</code>
       * @param value The bytes for password to set.
       * @return This builder for chaining.
       */
      public Builder setPasswordBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000080;
        password_ = value;
        onChanged();
        return this;
      }

      private boolean isStaff_ ;
      /**
       * <pre>
       * True if the user is a member of the system's staff.
       * Only available to admin users.
       * </pre>
       *
       * <code>optional bool is_staff = 8;</code>
       * @return Whether the isStaff field is set.
       */
      @java.lang.Override
      public boolean hasIsStaff() {
        return ((bitField0_ & 0x00000100) != 0);
      }
      /**
       * <pre>
       * True if the user is a member of the system's staff.
       * Only available to admin users.
       * </pre>
       *
       * <code>optional bool is_staff = 8;</code>
       * @return The isStaff.
       */
      @java.lang.Override
      public boolean getIsStaff() {
        return isStaff_;
      }
      /**
       * <pre>
       * True if the user is a member of the system's staff.
       * Only available to admin users.
       * </pre>
       *
       * <code>optional bool is_staff = 8;</code>
       * @param value The isStaff to set.
       * @return This builder for chaining.
       */
      public Builder setIsStaff(boolean value) {
        bitField0_ |= 0x00000100;
        isStaff_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * True if the user is a member of the system's staff.
       * Only available to admin users.
       * </pre>
       *
       * <code>optional bool is_staff = 8;</code>
       * @return This builder for chaining.
       */
      public Builder clearIsStaff() {
        bitField0_ = (bitField0_ & ~0x00000100);
        isStaff_ = false;
        onChanged();
        return this;
      }

      private boolean isSuperuser_ ;
      /**
       * <pre>
       * True if the user is an administrator.
       * Only available to admin users.
       * </pre>
       *
       * <code>optional bool is_superuser = 9;</code>
       * @return Whether the isSuperuser field is set.
       */
      @java.lang.Override
      public boolean hasIsSuperuser() {
        return ((bitField0_ & 0x00000200) != 0);
      }
      /**
       * <pre>
       * True if the user is an administrator.
       * Only available to admin users.
       * </pre>
       *
       * <code>optional bool is_superuser = 9;</code>
       * @return The isSuperuser.
       */
      @java.lang.Override
      public boolean getIsSuperuser() {
        return isSuperuser_;
      }
      /**
       * <pre>
       * True if the user is an administrator.
       * Only available to admin users.
       * </pre>
       *
       * <code>optional bool is_superuser = 9;</code>
       * @param value The isSuperuser to set.
       * @return This builder for chaining.
       */
      public Builder setIsSuperuser(boolean value) {
        bitField0_ |= 0x00000200;
        isSuperuser_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * True if the user is an administrator.
       * Only available to admin users.
       * </pre>
       *
       * <code>optional bool is_superuser = 9;</code>
       * @return This builder for chaining.
       */
      public Builder clearIsSuperuser() {
        bitField0_ = (bitField0_ & ~0x00000200);
        isSuperuser_ = false;
        onChanged();
        return this;
      }

      private java.lang.Object lastLogin_ = "";
      /**
       * <pre>
       * UTC time for the user's last login, as ISO8061 string.
       * Only available to admin users.
       * </pre>
       *
       * <code>optional string last_login = 10;</code>
       * @return Whether the lastLogin field is set.
       */
      public boolean hasLastLogin() {
        return ((bitField0_ & 0x00000400) != 0);
      }
      /**
       * <pre>
       * UTC time for the user's last login, as ISO8061 string.
       * Only available to admin users.
       * </pre>
       *
       * <code>optional string last_login = 10;</code>
       * @return The lastLogin.
       */
      public java.lang.String getLastLogin() {
        java.lang.Object ref = lastLogin_;
        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()) {
            lastLogin_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * UTC time for the user's last login, as ISO8061 string.
       * Only available to admin users.
       * </pre>
       *
       * <code>optional string last_login = 10;</code>
       * @return The bytes for lastLogin.
       */
      public com.google.protobuf.ByteString
          getLastLoginBytes() {
        java.lang.Object ref = lastLogin_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          lastLogin_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * UTC time for the user's last login, as ISO8061 string.
       * Only available to admin users.
       * </pre>
       *
       * <code>optional string last_login = 10;</code>
       * @param value The lastLogin to set.
       * @return This builder for chaining.
       */
      public Builder setLastLogin(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000400;
        lastLogin_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * UTC time for the user's last login, as ISO8061 string.
       * Only available to admin users.
       * </pre>
       *
       * <code>optional string last_login = 10;</code>
       * @return This builder for chaining.
       */
      public Builder clearLastLogin() {
        bitField0_ = (bitField0_ & ~0x00000400);
        lastLogin_ = getDefaultInstance().getLastLogin();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * UTC time for the user's last login, as ISO8061 string.
       * Only available to admin users.
       * </pre>
       *
       * <code>optional string last_login = 10;</code>
       * @param value The bytes for lastLogin to set.
       * @return This builder for chaining.
       */
      public Builder setLastLoginBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000400;
        lastLogin_ = value;
        onChanged();
        return this;
      }

      private java.lang.Object dateJoined_ = "";
      /**
       * <pre>
       * UTC time for the user's registration, as ISO8061 string.
       * Only available to admin users.
       * </pre>
       *
       * <code>optional string date_joined = 11;</code>
       * @return Whether the dateJoined field is set.
       */
      public boolean hasDateJoined() {
        return ((bitField0_ & 0x00000800) != 0);
      }
      /**
       * <pre>
       * UTC time for the user's registration, as ISO8061 string.
       * Only available to admin users.
       * </pre>
       *
       * <code>optional string date_joined = 11;</code>
       * @return The dateJoined.
       */
      public java.lang.String getDateJoined() {
        java.lang.Object ref = dateJoined_;
        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()) {
            dateJoined_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * UTC time for the user's registration, as ISO8061 string.
       * Only available to admin users.
       * </pre>
       *
       * <code>optional string date_joined = 11;</code>
       * @return The bytes for dateJoined.
       */
      public com.google.protobuf.ByteString
          getDateJoinedBytes() {
        java.lang.Object ref = dateJoined_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          dateJoined_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * UTC time for the user's registration, as ISO8061 string.
       * Only available to admin users.
       * </pre>
       *
       * <code>optional string date_joined = 11;</code>
       * @param value The dateJoined to set.
       * @return This builder for chaining.
       */
      public Builder setDateJoined(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000800;
        dateJoined_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * UTC time for the user's registration, as ISO8061 string.
       * Only available to admin users.
       * </pre>
       *
       * <code>optional string date_joined = 11;</code>
       * @return This builder for chaining.
       */
      public Builder clearDateJoined() {
        bitField0_ = (bitField0_ & ~0x00000800);
        dateJoined_ = getDefaultInstance().getDateJoined();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * UTC time for the user's registration, as ISO8061 string.
       * Only available to admin users.
       * </pre>
       *
       * <code>optional string date_joined = 11;</code>
       * @param value The bytes for dateJoined to set.
       * @return This builder for chaining.
       */
      public Builder setDateJoinedBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000800;
        dateJoined_ = value;
        onChanged();
        return this;
      }

      private java.lang.Object url_ = "";
      /**
       * <pre>
       * Canonical URL for this object.
       * </pre>
       *
       * <code>optional string url = 12;</code>
       * @return Whether the url field is set.
       */
      public boolean hasUrl() {
        return ((bitField0_ & 0x00001000) != 0);
      }
      /**
       * <pre>
       * Canonical URL for this object.
       * </pre>
       *
       * <code>optional string url = 12;</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>
       * Canonical URL for this object.
       * </pre>
       *
       * <code>optional string url = 12;</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>
       * Canonical URL for this object.
       * </pre>
       *
       * <code>optional string url = 12;</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_ |= 0x00001000;
        url_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Canonical URL for this object.
       * </pre>
       *
       * <code>optional string url = 12;</code>
       * @return This builder for chaining.
       */
      public Builder clearUrl() {
        bitField0_ = (bitField0_ & ~0x00001000);
        url_ = getDefaultInstance().getUrl();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Canonical URL for this object.
       * </pre>
       *
       * <code>optional string url = 12;</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_ |= 0x00001000;
        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:User)
    }

    // @@protoc_insertion_point(class_scope:User)
    private static final org.kegbot.proto.Models.User DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new org.kegbot.proto.Models.User();
    }

    public static org.kegbot.proto.Models.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 {
        Builder builder = newBuilder();
        try {
          builder.mergeFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          throw e.setUnfinishedMessage(builder.buildPartial());
        } catch (java.io.IOException e) {
          throw new com.google.protobuf.InvalidProtocolBufferException(
              e.getMessage()).setUnfinishedMessage(
                  builder.buildPartial());
        }
        return builder.buildPartial();
      }
    };

    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 org.kegbot.proto.Models.User getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface SiteInfoOrBuilder extends
      // @@protoc_insertion_point(interface_extends:SiteInfo)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <code>optional string title = 1;</code>
     * @return Whether the title field is set.
     */
    boolean hasTitle();
    /**
     * <code>optional string title = 1;</code>
     * @return The title.
     */
    java.lang.String getTitle();
    /**
     * <code>optional string title = 1;</code>
     * @return The bytes for title.
     */
    com.google.protobuf.ByteString
        getTitleBytes();

    /**
     * <code>optional string server_version = 2;</code>
     * @return Whether the serverVersion field is set.
     */
    boolean hasServerVersion();
    /**
     * <code>optional string server_version = 2;</code>
     * @return The serverVersion.
     */
    java.lang.String getServerVersion();
    /**
     * <code>optional string server_version = 2;</code>
     * @return The bytes for serverVersion.
     */
    com.google.protobuf.ByteString
        getServerVersionBytes();
  }
  /**
   * Protobuf type {@code SiteInfo}
   */
  public static final class SiteInfo extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:SiteInfo)
      SiteInfoOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use SiteInfo.newBuilder() to construct.
    private SiteInfo(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private SiteInfo() {
      title_ = "";
      serverVersion_ = "";
    }

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

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return org.kegbot.proto.Models.internal_static_SiteInfo_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return org.kegbot.proto.Models.internal_static_SiteInfo_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              org.kegbot.proto.Models.SiteInfo.class, org.kegbot.proto.Models.SiteInfo.Builder.class);
    }

    private int bitField0_;
    public static final int TITLE_FIELD_NUMBER = 1;
    private volatile java.lang.Object title_;
    /**
     * <code>optional string title = 1;</code>
     * @return Whether the title field is set.
     */
    @java.lang.Override
    public boolean hasTitle() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <code>optional string title = 1;</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;
      }
    }
    /**
     * <code>optional string title = 1;</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 SERVER_VERSION_FIELD_NUMBER = 2;
    private volatile java.lang.Object serverVersion_;
    /**
     * <code>optional string server_version = 2;</code>
     * @return Whether the serverVersion field is set.
     */
    @java.lang.Override
    public boolean hasServerVersion() {
      return ((bitField0_ & 0x00000002) != 0);
    }
    /**
     * <code>optional string server_version = 2;</code>
     * @return The serverVersion.
     */
    @java.lang.Override
    public java.lang.String getServerVersion() {
      java.lang.Object ref = serverVersion_;
      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()) {
          serverVersion_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string server_version = 2;</code>
     * @return The bytes for serverVersion.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getServerVersionBytes() {
      java.lang.Object ref = serverVersion_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        serverVersion_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static org.kegbot.proto.Models.SiteInfo parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.SiteInfo parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.SiteInfo parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.SiteInfo parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.SiteInfo parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.SiteInfo parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.SiteInfo parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.SiteInfo 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 org.kegbot.proto.Models.SiteInfo parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.SiteInfo 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 org.kegbot.proto.Models.SiteInfo parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.SiteInfo 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(org.kegbot.proto.Models.SiteInfo 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 SiteInfo}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:SiteInfo)
        org.kegbot.proto.Models.SiteInfoOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return org.kegbot.proto.Models.internal_static_SiteInfo_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return org.kegbot.proto.Models.internal_static_SiteInfo_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                org.kegbot.proto.Models.SiteInfo.class, org.kegbot.proto.Models.SiteInfo.Builder.class);
      }

      // Construct using org.kegbot.proto.Models.SiteInfo.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();
        title_ = "";
        bitField0_ = (bitField0_ & ~0x00000001);
        serverVersion_ = "";
        bitField0_ = (bitField0_ & ~0x00000002);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return org.kegbot.proto.Models.internal_static_SiteInfo_descriptor;
      }

      @java.lang.Override
      public org.kegbot.proto.Models.SiteInfo getDefaultInstanceForType() {
        return org.kegbot.proto.Models.SiteInfo.getDefaultInstance();
      }

      @java.lang.Override
      public org.kegbot.proto.Models.SiteInfo build() {
        org.kegbot.proto.Models.SiteInfo result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public org.kegbot.proto.Models.SiteInfo buildPartial() {
        org.kegbot.proto.Models.SiteInfo result = new org.kegbot.proto.Models.SiteInfo(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) != 0)) {
          to_bitField0_ |= 0x00000001;
        }
        result.title_ = title_;
        if (((from_bitField0_ & 0x00000002) != 0)) {
          to_bitField0_ |= 0x00000002;
        }
        result.serverVersion_ = serverVersion_;
        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);
      }
      private int bitField0_;

      private java.lang.Object title_ = "";
      /**
       * <code>optional string title = 1;</code>
       * @return Whether the title field is set.
       */
      public boolean hasTitle() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <code>optional string title = 1;</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;
        }
      }
      /**
       * <code>optional string title = 1;</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;
        }
      }
      /**
       * <code>optional string title = 1;</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_ |= 0x00000001;
        title_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string title = 1;</code>
       * @return This builder for chaining.
       */
      public Builder clearTitle() {
        bitField0_ = (bitField0_ & ~0x00000001);
        title_ = getDefaultInstance().getTitle();
        onChanged();
        return this;
      }
      /**
       * <code>optional string title = 1;</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_ |= 0x00000001;
        title_ = value;
        onChanged();
        return this;
      }

      private java.lang.Object serverVersion_ = "";
      /**
       * <code>optional string server_version = 2;</code>
       * @return Whether the serverVersion field is set.
       */
      public boolean hasServerVersion() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <code>optional string server_version = 2;</code>
       * @return The serverVersion.
       */
      public java.lang.String getServerVersion() {
        java.lang.Object ref = serverVersion_;
        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()) {
            serverVersion_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string server_version = 2;</code>
       * @return The bytes for serverVersion.
       */
      public com.google.protobuf.ByteString
          getServerVersionBytes() {
        java.lang.Object ref = serverVersion_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          serverVersion_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string server_version = 2;</code>
       * @param value The serverVersion to set.
       * @return This builder for chaining.
       */
      public Builder setServerVersion(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
        serverVersion_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string server_version = 2;</code>
       * @return This builder for chaining.
       */
      public Builder clearServerVersion() {
        bitField0_ = (bitField0_ & ~0x00000002);
        serverVersion_ = getDefaultInstance().getServerVersion();
        onChanged();
        return this;
      }
      /**
       * <code>optional string server_version = 2;</code>
       * @param value The bytes for serverVersion to set.
       * @return This builder for chaining.
       */
      public Builder setServerVersionBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
        serverVersion_ = 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:SiteInfo)
    }

    // @@protoc_insertion_point(class_scope:SiteInfo)
    private static final org.kegbot.proto.Models.SiteInfo DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new org.kegbot.proto.Models.SiteInfo();
    }

    public static org.kegbot.proto.Models.SiteInfo getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

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

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

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

    @java.lang.Override
    public org.kegbot.proto.Models.SiteInfo getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface SystemEventOrBuilder extends
      // @@protoc_insertion_point(interface_extends:SystemEvent)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <pre>
     * The unqiue identifier for this event.
     * </pre>
     *
     * <code>required uint32 id = 1;</code>
     * @return Whether the id field is set.
     */
    boolean hasId();
    /**
     * <pre>
     * The unqiue identifier for this event.
     * </pre>
     *
     * <code>required uint32 id = 1;</code>
     * @return The id.
     */
    int getId();

    /**
     * <pre>
     * The kind of the event being reported. Current values: ``drink_poured``,
     * ``session_started``, ``session_joined``, ``keg_tapped``, ``keg_ended``.
     * </pre>
     *
     * <code>required string kind = 2;</code>
     * @return Whether the kind field is set.
     */
    boolean hasKind();
    /**
     * <pre>
     * The kind of the event being reported. Current values: ``drink_poured``,
     * ``session_started``, ``session_joined``, ``keg_tapped``, ``keg_ended``.
     * </pre>
     *
     * <code>required string kind = 2;</code>
     * @return The kind.
     */
    java.lang.String getKind();
    /**
     * <pre>
     * The kind of the event being reported. Current values: ``drink_poured``,
     * ``session_started``, ``session_joined``, ``keg_tapped``, ``keg_ended``.
     * </pre>
     *
     * <code>required string kind = 2;</code>
     * @return The bytes for kind.
     */
    com.google.protobuf.ByteString
        getKindBytes();

    /**
     * <pre>
     * The time of this event, as an ISO8061 UTC timestamp.
     * </pre>
     *
     * <code>required string time = 3;</code>
     * @return Whether the time field is set.
     */
    boolean hasTime();
    /**
     * <pre>
     * The time of this event, as an ISO8061 UTC timestamp.
     * </pre>
     *
     * <code>required string time = 3;</code>
     * @return The time.
     */
    java.lang.String getTime();
    /**
     * <pre>
     * The time of this event, as an ISO8061 UTC timestamp.
     * </pre>
     *
     * <code>required string time = 3;</code>
     * @return The bytes for time.
     */
    com.google.protobuf.ByteString
        getTimeBytes();

    /**
     * <pre>
     * If a drink caused this event (as in ``drink_poured``, ``session_started``,
     * and ``session_joined``), this field gives its id.
     * </pre>
     *
     * <code>optional uint32 drink_id = 4;</code>
     * @return Whether the drinkId field is set.
     */
    boolean hasDrinkId();
    /**
     * <pre>
     * If a drink caused this event (as in ``drink_poured``, ``session_started``,
     * and ``session_joined``), this field gives its id.
     * </pre>
     *
     * <code>optional uint32 drink_id = 4;</code>
     * @return The drinkId.
     */
    int getDrinkId();

    /**
     * <pre>
     * If this event relates to a specific keg (as in most events), this field
     * gives its id.
     * </pre>
     *
     * <code>optional uint32 keg_id = 5;</code>
     * @return Whether the kegId field is set.
     */
    boolean hasKegId();
    /**
     * <pre>
     * If this event relates to a specific keg (as in most events), this field
     * gives its id.
     * </pre>
     *
     * <code>optional uint32 keg_id = 5;</code>
     * @return The kegId.
     */
    int getKegId();

    /**
     * <pre>
     * If this event relates to a specific session (as in ``drink_poured``,
     * ``session_started``, and ``session_joined``), this field gives its id.
     * </pre>
     *
     * <code>optional uint32 session_id = 6;</code>
     * @return Whether the sessionId field is set.
     */
    boolean hasSessionId();
    /**
     * <pre>
     * If this event relates to a specific session (as in ``drink_poured``,
     * ``session_started``, and ``session_joined``), this field gives its id.
     * </pre>
     *
     * <code>optional uint32 session_id = 6;</code>
     * @return The sessionId.
     */
    int getSessionId();

    /**
     * <pre>
     * If this event relates to a specific user (as in ``drink_poured``,
     * ``session_started``, and ``session_joined`` when the user is not
     * anonymous), this field gives the user's id.
     * </pre>
     *
     * <code>optional string user_id = 7;</code>
     * @return Whether the userId field is set.
     */
    boolean hasUserId();
    /**
     * <pre>
     * If this event relates to a specific user (as in ``drink_poured``,
     * ``session_started``, and ``session_joined`` when the user is not
     * anonymous), this field gives the user's id.
     * </pre>
     *
     * <code>optional string user_id = 7;</code>
     * @return The userId.
     */
    java.lang.String getUserId();
    /**
     * <pre>
     * If this event relates to a specific user (as in ``drink_poured``,
     * ``session_started``, and ``session_joined`` when the user is not
     * anonymous), this field gives the user's id.
     * </pre>
     *
     * <code>optional string user_id = 7;</code>
     * @return The bytes for userId.
     */
    com.google.protobuf.ByteString
        getUserIdBytes();

    /**
     * <code>optional .Image image = 8;</code>
     * @return Whether the image field is set.
     */
    boolean hasImage();
    /**
     * <code>optional .Image image = 8;</code>
     * @return The image.
     */
    org.kegbot.proto.Models.Image getImage();
    /**
     * <code>optional .Image image = 8;</code>
     */
    org.kegbot.proto.Models.ImageOrBuilder getImageOrBuilder();

    /**
     * <code>optional .User user = 9;</code>
     * @return Whether the user field is set.
     */
    boolean hasUser();
    /**
     * <code>optional .User user = 9;</code>
     * @return The user.
     */
    org.kegbot.proto.Models.User getUser();
    /**
     * <code>optional .User user = 9;</code>
     */
    org.kegbot.proto.Models.UserOrBuilder getUserOrBuilder();

    /**
     * <code>optional .Drink drink = 10;</code>
     * @return Whether the drink field is set.
     */
    boolean hasDrink();
    /**
     * <code>optional .Drink drink = 10;</code>
     * @return The drink.
     */
    org.kegbot.proto.Models.Drink getDrink();
    /**
     * <code>optional .Drink drink = 10;</code>
     */
    org.kegbot.proto.Models.DrinkOrBuilder getDrinkOrBuilder();

    /**
     * <code>optional .Keg keg = 11;</code>
     * @return Whether the keg field is set.
     */
    boolean hasKeg();
    /**
     * <code>optional .Keg keg = 11;</code>
     * @return The keg.
     */
    org.kegbot.proto.Models.Keg getKeg();
    /**
     * <code>optional .Keg keg = 11;</code>
     */
    org.kegbot.proto.Models.KegOrBuilder getKegOrBuilder();

    /**
     * <code>optional .Session session = 12;</code>
     * @return Whether the session field is set.
     */
    boolean hasSession();
    /**
     * <code>optional .Session session = 12;</code>
     * @return The session.
     */
    org.kegbot.proto.Models.Session getSession();
    /**
     * <code>optional .Session session = 12;</code>
     */
    org.kegbot.proto.Models.SessionOrBuilder getSessionOrBuilder();
  }
  /**
   * <pre>
   * Describes various events that happen in the system.
   * </pre>
   *
   * Protobuf type {@code SystemEvent}
   */
  public static final class SystemEvent extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:SystemEvent)
      SystemEventOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use SystemEvent.newBuilder() to construct.
    private SystemEvent(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private SystemEvent() {
      kind_ = "";
      time_ = "";
      userId_ = "";
    }

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

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return org.kegbot.proto.Models.internal_static_SystemEvent_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return org.kegbot.proto.Models.internal_static_SystemEvent_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              org.kegbot.proto.Models.SystemEvent.class, org.kegbot.proto.Models.SystemEvent.Builder.class);
    }

    private int bitField0_;
    public static final int ID_FIELD_NUMBER = 1;
    private int id_;
    /**
     * <pre>
     * The unqiue identifier for this event.
     * </pre>
     *
     * <code>required uint32 id = 1;</code>
     * @return Whether the id field is set.
     */
    @java.lang.Override
    public boolean hasId() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <pre>
     * The unqiue identifier for this event.
     * </pre>
     *
     * <code>required uint32 id = 1;</code>
     * @return The id.
     */
    @java.lang.Override
    public int getId() {
      return id_;
    }

    public static final int KIND_FIELD_NUMBER = 2;
    private volatile java.lang.Object kind_;
    /**
     * <pre>
     * The kind of the event being reported. Current values: ``drink_poured``,
     * ``session_started``, ``session_joined``, ``keg_tapped``, ``keg_ended``.
     * </pre>
     *
     * <code>required string kind = 2;</code>
     * @return Whether the kind field is set.
     */
    @java.lang.Override
    public boolean hasKind() {
      return ((bitField0_ & 0x00000002) != 0);
    }
    /**
     * <pre>
     * The kind of the event being reported. Current values: ``drink_poured``,
     * ``session_started``, ``session_joined``, ``keg_tapped``, ``keg_ended``.
     * </pre>
     *
     * <code>required string kind = 2;</code>
     * @return The kind.
     */
    @java.lang.Override
    public java.lang.String getKind() {
      java.lang.Object ref = kind_;
      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()) {
          kind_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * The kind of the event being reported. Current values: ``drink_poured``,
     * ``session_started``, ``session_joined``, ``keg_tapped``, ``keg_ended``.
     * </pre>
     *
     * <code>required string kind = 2;</code>
     * @return The bytes for kind.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getKindBytes() {
      java.lang.Object ref = kind_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        kind_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int TIME_FIELD_NUMBER = 3;
    private volatile java.lang.Object time_;
    /**
     * <pre>
     * The time of this event, as an ISO8061 UTC timestamp.
     * </pre>
     *
     * <code>required string time = 3;</code>
     * @return Whether the time field is set.
     */
    @java.lang.Override
    public boolean hasTime() {
      return ((bitField0_ & 0x00000004) != 0);
    }
    /**
     * <pre>
     * The time of this event, as an ISO8061 UTC timestamp.
     * </pre>
     *
     * <code>required string time = 3;</code>
     * @return The time.
     */
    @java.lang.Override
    public java.lang.String getTime() {
      java.lang.Object ref = time_;
      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()) {
          time_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * The time of this event, as an ISO8061 UTC timestamp.
     * </pre>
     *
     * <code>required string time = 3;</code>
     * @return The bytes for time.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getTimeBytes() {
      java.lang.Object ref = time_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        time_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int DRINK_ID_FIELD_NUMBER = 4;
    private int drinkId_;
    /**
     * <pre>
     * If a drink caused this event (as in ``drink_poured``, ``session_started``,
     * and ``session_joined``), this field gives its id.
     * </pre>
     *
     * <code>optional uint32 drink_id = 4;</code>
     * @return Whether the drinkId field is set.
     */
    @java.lang.Override
    public boolean hasDrinkId() {
      return ((bitField0_ & 0x00000008) != 0);
    }
    /**
     * <pre>
     * If a drink caused this event (as in ``drink_poured``, ``session_started``,
     * and ``session_joined``), this field gives its id.
     * </pre>
     *
     * <code>optional uint32 drink_id = 4;</code>
     * @return The drinkId.
     */
    @java.lang.Override
    public int getDrinkId() {
      return drinkId_;
    }

    public static final int KEG_ID_FIELD_NUMBER = 5;
    private int kegId_;
    /**
     * <pre>
     * If this event relates to a specific keg (as in most events), this field
     * gives its id.
     * </pre>
     *
     * <code>optional uint32 keg_id = 5;</code>
     * @return Whether the kegId field is set.
     */
    @java.lang.Override
    public boolean hasKegId() {
      return ((bitField0_ & 0x00000010) != 0);
    }
    /**
     * <pre>
     * If this event relates to a specific keg (as in most events), this field
     * gives its id.
     * </pre>
     *
     * <code>optional uint32 keg_id = 5;</code>
     * @return The kegId.
     */
    @java.lang.Override
    public int getKegId() {
      return kegId_;
    }

    public static final int SESSION_ID_FIELD_NUMBER = 6;
    private int sessionId_;
    /**
     * <pre>
     * If this event relates to a specific session (as in ``drink_poured``,
     * ``session_started``, and ``session_joined``), this field gives its id.
     * </pre>
     *
     * <code>optional uint32 session_id = 6;</code>
     * @return Whether the sessionId field is set.
     */
    @java.lang.Override
    public boolean hasSessionId() {
      return ((bitField0_ & 0x00000020) != 0);
    }
    /**
     * <pre>
     * If this event relates to a specific session (as in ``drink_poured``,
     * ``session_started``, and ``session_joined``), this field gives its id.
     * </pre>
     *
     * <code>optional uint32 session_id = 6;</code>
     * @return The sessionId.
     */
    @java.lang.Override
    public int getSessionId() {
      return sessionId_;
    }

    public static final int USER_ID_FIELD_NUMBER = 7;
    private volatile java.lang.Object userId_;
    /**
     * <pre>
     * If this event relates to a specific user (as in ``drink_poured``,
     * ``session_started``, and ``session_joined`` when the user is not
     * anonymous), this field gives the user's id.
     * </pre>
     *
     * <code>optional string user_id = 7;</code>
     * @return Whether the userId field is set.
     */
    @java.lang.Override
    public boolean hasUserId() {
      return ((bitField0_ & 0x00000040) != 0);
    }
    /**
     * <pre>
     * If this event relates to a specific user (as in ``drink_poured``,
     * ``session_started``, and ``session_joined`` when the user is not
     * anonymous), this field gives the user's id.
     * </pre>
     *
     * <code>optional string user_id = 7;</code>
     * @return The userId.
     */
    @java.lang.Override
    public java.lang.String getUserId() {
      java.lang.Object ref = userId_;
      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()) {
          userId_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * If this event relates to a specific user (as in ``drink_poured``,
     * ``session_started``, and ``session_joined`` when the user is not
     * anonymous), this field gives the user's id.
     * </pre>
     *
     * <code>optional string user_id = 7;</code>
     * @return The bytes for userId.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getUserIdBytes() {
      java.lang.Object ref = userId_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        userId_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int IMAGE_FIELD_NUMBER = 8;
    private org.kegbot.proto.Models.Image image_;
    /**
     * <code>optional .Image image = 8;</code>
     * @return Whether the image field is set.
     */
    @java.lang.Override
    public boolean hasImage() {
      return ((bitField0_ & 0x00000080) != 0);
    }
    /**
     * <code>optional .Image image = 8;</code>
     * @return The image.
     */
    @java.lang.Override
    public org.kegbot.proto.Models.Image getImage() {
      return image_ == null ? org.kegbot.proto.Models.Image.getDefaultInstance() : image_;
    }
    /**
     * <code>optional .Image image = 8;</code>
     */
    @java.lang.Override
    public org.kegbot.proto.Models.ImageOrBuilder getImageOrBuilder() {
      return image_ == null ? org.kegbot.proto.Models.Image.getDefaultInstance() : image_;
    }

    public static final int USER_FIELD_NUMBER = 9;
    private org.kegbot.proto.Models.User user_;
    /**
     * <code>optional .User user = 9;</code>
     * @return Whether the user field is set.
     */
    @java.lang.Override
    public boolean hasUser() {
      return ((bitField0_ & 0x00000100) != 0);
    }
    /**
     * <code>optional .User user = 9;</code>
     * @return The user.
     */
    @java.lang.Override
    public org.kegbot.proto.Models.User getUser() {
      return user_ == null ? org.kegbot.proto.Models.User.getDefaultInstance() : user_;
    }
    /**
     * <code>optional .User user = 9;</code>
     */
    @java.lang.Override
    public org.kegbot.proto.Models.UserOrBuilder getUserOrBuilder() {
      return user_ == null ? org.kegbot.proto.Models.User.getDefaultInstance() : user_;
    }

    public static final int DRINK_FIELD_NUMBER = 10;
    private org.kegbot.proto.Models.Drink drink_;
    /**
     * <code>optional .Drink drink = 10;</code>
     * @return Whether the drink field is set.
     */
    @java.lang.Override
    public boolean hasDrink() {
      return ((bitField0_ & 0x00000200) != 0);
    }
    /**
     * <code>optional .Drink drink = 10;</code>
     * @return The drink.
     */
    @java.lang.Override
    public org.kegbot.proto.Models.Drink getDrink() {
      return drink_ == null ? org.kegbot.proto.Models.Drink.getDefaultInstance() : drink_;
    }
    /**
     * <code>optional .Drink drink = 10;</code>
     */
    @java.lang.Override
    public org.kegbot.proto.Models.DrinkOrBuilder getDrinkOrBuilder() {
      return drink_ == null ? org.kegbot.proto.Models.Drink.getDefaultInstance() : drink_;
    }

    public static final int KEG_FIELD_NUMBER = 11;
    private org.kegbot.proto.Models.Keg keg_;
    /**
     * <code>optional .Keg keg = 11;</code>
     * @return Whether the keg field is set.
     */
    @java.lang.Override
    public boolean hasKeg() {
      return ((bitField0_ & 0x00000400) != 0);
    }
    /**
     * <code>optional .Keg keg = 11;</code>
     * @return The keg.
     */
    @java.lang.Override
    public org.kegbot.proto.Models.Keg getKeg() {
      return keg_ == null ? org.kegbot.proto.Models.Keg.getDefaultInstance() : keg_;
    }
    /**
     * <code>optional .Keg keg = 11;</code>
     */
    @java.lang.Override
    public org.kegbot.proto.Models.KegOrBuilder getKegOrBuilder() {
      return keg_ == null ? org.kegbot.proto.Models.Keg.getDefaultInstance() : keg_;
    }

    public static final int SESSION_FIELD_NUMBER = 12;
    private org.kegbot.proto.Models.Session session_;
    /**
     * <code>optional .Session session = 12;</code>
     * @return Whether the session field is set.
     */
    @java.lang.Override
    public boolean hasSession() {
      return ((bitField0_ & 0x00000800) != 0);
    }
    /**
     * <code>optional .Session session = 12;</code>
     * @return The session.
     */
    @java.lang.Override
    public org.kegbot.proto.Models.Session getSession() {
      return session_ == null ? org.kegbot.proto.Models.Session.getDefaultInstance() : session_;
    }
    /**
     * <code>optional .Session session = 12;</code>
     */
    @java.lang.Override
    public org.kegbot.proto.Models.SessionOrBuilder getSessionOrBuilder() {
      return session_ == null ? org.kegbot.proto.Models.Session.getDefaultInstance() : session_;
    }

    public static org.kegbot.proto.Models.SystemEvent parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.SystemEvent parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.SystemEvent parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.SystemEvent parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.SystemEvent parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.SystemEvent parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.SystemEvent parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.SystemEvent 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 org.kegbot.proto.Models.SystemEvent parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.SystemEvent 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 org.kegbot.proto.Models.SystemEvent parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.SystemEvent 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(org.kegbot.proto.Models.SystemEvent 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>
     * Describes various events that happen in the system.
     * </pre>
     *
     * Protobuf type {@code SystemEvent}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:SystemEvent)
        org.kegbot.proto.Models.SystemEventOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return org.kegbot.proto.Models.internal_static_SystemEvent_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return org.kegbot.proto.Models.internal_static_SystemEvent_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                org.kegbot.proto.Models.SystemEvent.class, org.kegbot.proto.Models.SystemEvent.Builder.class);
      }

      // Construct using org.kegbot.proto.Models.SystemEvent.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
          getImageFieldBuilder();
          getUserFieldBuilder();
          getDrinkFieldBuilder();
          getKegFieldBuilder();
          getSessionFieldBuilder();
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        id_ = 0;
        bitField0_ = (bitField0_ & ~0x00000001);
        kind_ = "";
        bitField0_ = (bitField0_ & ~0x00000002);
        time_ = "";
        bitField0_ = (bitField0_ & ~0x00000004);
        drinkId_ = 0;
        bitField0_ = (bitField0_ & ~0x00000008);
        kegId_ = 0;
        bitField0_ = (bitField0_ & ~0x00000010);
        sessionId_ = 0;
        bitField0_ = (bitField0_ & ~0x00000020);
        userId_ = "";
        bitField0_ = (bitField0_ & ~0x00000040);
        if (imageBuilder_ == null) {
          image_ = null;
        } else {
          imageBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000080);
        if (userBuilder_ == null) {
          user_ = null;
        } else {
          userBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000100);
        if (drinkBuilder_ == null) {
          drink_ = null;
        } else {
          drinkBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000200);
        if (kegBuilder_ == null) {
          keg_ = null;
        } else {
          kegBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000400);
        if (sessionBuilder_ == null) {
          session_ = null;
        } else {
          sessionBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000800);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return org.kegbot.proto.Models.internal_static_SystemEvent_descriptor;
      }

      @java.lang.Override
      public org.kegbot.proto.Models.SystemEvent getDefaultInstanceForType() {
        return org.kegbot.proto.Models.SystemEvent.getDefaultInstance();
      }

      @java.lang.Override
      public org.kegbot.proto.Models.SystemEvent build() {
        org.kegbot.proto.Models.SystemEvent result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public org.kegbot.proto.Models.SystemEvent buildPartial() {
        org.kegbot.proto.Models.SystemEvent result = new org.kegbot.proto.Models.SystemEvent(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)) {
          to_bitField0_ |= 0x00000002;
        }
        result.kind_ = kind_;
        if (((from_bitField0_ & 0x00000004) != 0)) {
          to_bitField0_ |= 0x00000004;
        }
        result.time_ = time_;
        if (((from_bitField0_ & 0x00000008) != 0)) {
          result.drinkId_ = drinkId_;
          to_bitField0_ |= 0x00000008;
        }
        if (((from_bitField0_ & 0x00000010) != 0)) {
          result.kegId_ = kegId_;
          to_bitField0_ |= 0x00000010;
        }
        if (((from_bitField0_ & 0x00000020) != 0)) {
          result.sessionId_ = sessionId_;
          to_bitField0_ |= 0x00000020;
        }
        if (((from_bitField0_ & 0x00000040) != 0)) {
          to_bitField0_ |= 0x00000040;
        }
        result.userId_ = userId_;
        if (((from_bitField0_ & 0x00000080) != 0)) {
          if (imageBuilder_ == null) {
            result.image_ = image_;
          } else {
            result.image_ = imageBuilder_.build();
          }
          to_bitField0_ |= 0x00000080;
        }
        if (((from_bitField0_ & 0x00000100) != 0)) {
          if (userBuilder_ == null) {
            result.user_ = user_;
          } else {
            result.user_ = userBuilder_.build();
          }
          to_bitField0_ |= 0x00000100;
        }
        if (((from_bitField0_ & 0x00000200) != 0)) {
          if (drinkBuilder_ == null) {
            result.drink_ = drink_;
          } else {
            result.drink_ = drinkBuilder_.build();
          }
          to_bitField0_ |= 0x00000200;
        }
        if (((from_bitField0_ & 0x00000400) != 0)) {
          if (kegBuilder_ == null) {
            result.keg_ = keg_;
          } else {
            result.keg_ = kegBuilder_.build();
          }
          to_bitField0_ |= 0x00000400;
        }
        if (((from_bitField0_ & 0x00000800) != 0)) {
          if (sessionBuilder_ == null) {
            result.session_ = session_;
          } else {
            result.session_ = sessionBuilder_.build();
          }
          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);
      }
      private int bitField0_;

      private int id_ ;
      /**
       * <pre>
       * The unqiue identifier for this event.
       * </pre>
       *
       * <code>required uint32 id = 1;</code>
       * @return Whether the id field is set.
       */
      @java.lang.Override
      public boolean hasId() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <pre>
       * The unqiue identifier for this event.
       * </pre>
       *
       * <code>required uint32 id = 1;</code>
       * @return The id.
       */
      @java.lang.Override
      public int getId() {
        return id_;
      }
      /**
       * <pre>
       * The unqiue identifier for this event.
       * </pre>
       *
       * <code>required uint32 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>
       * The unqiue identifier for this event.
       * </pre>
       *
       * <code>required uint32 id = 1;</code>
       * @return This builder for chaining.
       */
      public Builder clearId() {
        bitField0_ = (bitField0_ & ~0x00000001);
        id_ = 0;
        onChanged();
        return this;
      }

      private java.lang.Object kind_ = "";
      /**
       * <pre>
       * The kind of the event being reported. Current values: ``drink_poured``,
       * ``session_started``, ``session_joined``, ``keg_tapped``, ``keg_ended``.
       * </pre>
       *
       * <code>required string kind = 2;</code>
       * @return Whether the kind field is set.
       */
      public boolean hasKind() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <pre>
       * The kind of the event being reported. Current values: ``drink_poured``,
       * ``session_started``, ``session_joined``, ``keg_tapped``, ``keg_ended``.
       * </pre>
       *
       * <code>required string kind = 2;</code>
       * @return The kind.
       */
      public java.lang.String getKind() {
        java.lang.Object ref = kind_;
        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()) {
            kind_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * The kind of the event being reported. Current values: ``drink_poured``,
       * ``session_started``, ``session_joined``, ``keg_tapped``, ``keg_ended``.
       * </pre>
       *
       * <code>required string kind = 2;</code>
       * @return The bytes for kind.
       */
      public com.google.protobuf.ByteString
          getKindBytes() {
        java.lang.Object ref = kind_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          kind_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * The kind of the event being reported. Current values: ``drink_poured``,
       * ``session_started``, ``session_joined``, ``keg_tapped``, ``keg_ended``.
       * </pre>
       *
       * <code>required string kind = 2;</code>
       * @param value The kind to set.
       * @return This builder for chaining.
       */
      public Builder setKind(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
        kind_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The kind of the event being reported. Current values: ``drink_poured``,
       * ``session_started``, ``session_joined``, ``keg_tapped``, ``keg_ended``.
       * </pre>
       *
       * <code>required string kind = 2;</code>
       * @return This builder for chaining.
       */
      public Builder clearKind() {
        bitField0_ = (bitField0_ & ~0x00000002);
        kind_ = getDefaultInstance().getKind();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The kind of the event being reported. Current values: ``drink_poured``,
       * ``session_started``, ``session_joined``, ``keg_tapped``, ``keg_ended``.
       * </pre>
       *
       * <code>required string kind = 2;</code>
       * @param value The bytes for kind to set.
       * @return This builder for chaining.
       */
      public Builder setKindBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
        kind_ = value;
        onChanged();
        return this;
      }

      private java.lang.Object time_ = "";
      /**
       * <pre>
       * The time of this event, as an ISO8061 UTC timestamp.
       * </pre>
       *
       * <code>required string time = 3;</code>
       * @return Whether the time field is set.
       */
      public boolean hasTime() {
        return ((bitField0_ & 0x00000004) != 0);
      }
      /**
       * <pre>
       * The time of this event, as an ISO8061 UTC timestamp.
       * </pre>
       *
       * <code>required string time = 3;</code>
       * @return The time.
       */
      public java.lang.String getTime() {
        java.lang.Object ref = time_;
        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()) {
            time_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * The time of this event, as an ISO8061 UTC timestamp.
       * </pre>
       *
       * <code>required string time = 3;</code>
       * @return The bytes for time.
       */
      public com.google.protobuf.ByteString
          getTimeBytes() {
        java.lang.Object ref = time_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          time_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * The time of this event, as an ISO8061 UTC timestamp.
       * </pre>
       *
       * <code>required string time = 3;</code>
       * @param value The time to set.
       * @return This builder for chaining.
       */
      public Builder setTime(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
        time_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The time of this event, as an ISO8061 UTC timestamp.
       * </pre>
       *
       * <code>required string time = 3;</code>
       * @return This builder for chaining.
       */
      public Builder clearTime() {
        bitField0_ = (bitField0_ & ~0x00000004);
        time_ = getDefaultInstance().getTime();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The time of this event, as an ISO8061 UTC timestamp.
       * </pre>
       *
       * <code>required string time = 3;</code>
       * @param value The bytes for time to set.
       * @return This builder for chaining.
       */
      public Builder setTimeBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
        time_ = value;
        onChanged();
        return this;
      }

      private int drinkId_ ;
      /**
       * <pre>
       * If a drink caused this event (as in ``drink_poured``, ``session_started``,
       * and ``session_joined``), this field gives its id.
       * </pre>
       *
       * <code>optional uint32 drink_id = 4;</code>
       * @return Whether the drinkId field is set.
       */
      @java.lang.Override
      public boolean hasDrinkId() {
        return ((bitField0_ & 0x00000008) != 0);
      }
      /**
       * <pre>
       * If a drink caused this event (as in ``drink_poured``, ``session_started``,
       * and ``session_joined``), this field gives its id.
       * </pre>
       *
       * <code>optional uint32 drink_id = 4;</code>
       * @return The drinkId.
       */
      @java.lang.Override
      public int getDrinkId() {
        return drinkId_;
      }
      /**
       * <pre>
       * If a drink caused this event (as in ``drink_poured``, ``session_started``,
       * and ``session_joined``), this field gives its id.
       * </pre>
       *
       * <code>optional uint32 drink_id = 4;</code>
       * @param value The drinkId to set.
       * @return This builder for chaining.
       */
      public Builder setDrinkId(int value) {
        bitField0_ |= 0x00000008;
        drinkId_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * If a drink caused this event (as in ``drink_poured``, ``session_started``,
       * and ``session_joined``), this field gives its id.
       * </pre>
       *
       * <code>optional uint32 drink_id = 4;</code>
       * @return This builder for chaining.
       */
      public Builder clearDrinkId() {
        bitField0_ = (bitField0_ & ~0x00000008);
        drinkId_ = 0;
        onChanged();
        return this;
      }

      private int kegId_ ;
      /**
       * <pre>
       * If this event relates to a specific keg (as in most events), this field
       * gives its id.
       * </pre>
       *
       * <code>optional uint32 keg_id = 5;</code>
       * @return Whether the kegId field is set.
       */
      @java.lang.Override
      public boolean hasKegId() {
        return ((bitField0_ & 0x00000010) != 0);
      }
      /**
       * <pre>
       * If this event relates to a specific keg (as in most events), this field
       * gives its id.
       * </pre>
       *
       * <code>optional uint32 keg_id = 5;</code>
       * @return The kegId.
       */
      @java.lang.Override
      public int getKegId() {
        return kegId_;
      }
      /**
       * <pre>
       * If this event relates to a specific keg (as in most events), this field
       * gives its id.
       * </pre>
       *
       * <code>optional uint32 keg_id = 5;</code>
       * @param value The kegId to set.
       * @return This builder for chaining.
       */
      public Builder setKegId(int value) {
        bitField0_ |= 0x00000010;
        kegId_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * If this event relates to a specific keg (as in most events), this field
       * gives its id.
       * </pre>
       *
       * <code>optional uint32 keg_id = 5;</code>
       * @return This builder for chaining.
       */
      public Builder clearKegId() {
        bitField0_ = (bitField0_ & ~0x00000010);
        kegId_ = 0;
        onChanged();
        return this;
      }

      private int sessionId_ ;
      /**
       * <pre>
       * If this event relates to a specific session (as in ``drink_poured``,
       * ``session_started``, and ``session_joined``), this field gives its id.
       * </pre>
       *
       * <code>optional uint32 session_id = 6;</code>
       * @return Whether the sessionId field is set.
       */
      @java.lang.Override
      public boolean hasSessionId() {
        return ((bitField0_ & 0x00000020) != 0);
      }
      /**
       * <pre>
       * If this event relates to a specific session (as in ``drink_poured``,
       * ``session_started``, and ``session_joined``), this field gives its id.
       * </pre>
       *
       * <code>optional uint32 session_id = 6;</code>
       * @return The sessionId.
       */
      @java.lang.Override
      public int getSessionId() {
        return sessionId_;
      }
      /**
       * <pre>
       * If this event relates to a specific session (as in ``drink_poured``,
       * ``session_started``, and ``session_joined``), this field gives its id.
       * </pre>
       *
       * <code>optional uint32 session_id = 6;</code>
       * @param value The sessionId to set.
       * @return This builder for chaining.
       */
      public Builder setSessionId(int value) {
        bitField0_ |= 0x00000020;
        sessionId_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * If this event relates to a specific session (as in ``drink_poured``,
       * ``session_started``, and ``session_joined``), this field gives its id.
       * </pre>
       *
       * <code>optional uint32 session_id = 6;</code>
       * @return This builder for chaining.
       */
      public Builder clearSessionId() {
        bitField0_ = (bitField0_ & ~0x00000020);
        sessionId_ = 0;
        onChanged();
        return this;
      }

      private java.lang.Object userId_ = "";
      /**
       * <pre>
       * If this event relates to a specific user (as in ``drink_poured``,
       * ``session_started``, and ``session_joined`` when the user is not
       * anonymous), this field gives the user's id.
       * </pre>
       *
       * <code>optional string user_id = 7;</code>
       * @return Whether the userId field is set.
       */
      public boolean hasUserId() {
        return ((bitField0_ & 0x00000040) != 0);
      }
      /**
       * <pre>
       * If this event relates to a specific user (as in ``drink_poured``,
       * ``session_started``, and ``session_joined`` when the user is not
       * anonymous), this field gives the user's id.
       * </pre>
       *
       * <code>optional string user_id = 7;</code>
       * @return The userId.
       */
      public java.lang.String getUserId() {
        java.lang.Object ref = userId_;
        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()) {
            userId_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * If this event relates to a specific user (as in ``drink_poured``,
       * ``session_started``, and ``session_joined`` when the user is not
       * anonymous), this field gives the user's id.
       * </pre>
       *
       * <code>optional string user_id = 7;</code>
       * @return The bytes for userId.
       */
      public com.google.protobuf.ByteString
          getUserIdBytes() {
        java.lang.Object ref = userId_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          userId_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * If this event relates to a specific user (as in ``drink_poured``,
       * ``session_started``, and ``session_joined`` when the user is not
       * anonymous), this field gives the user's id.
       * </pre>
       *
       * <code>optional string user_id = 7;</code>
       * @param value The userId to set.
       * @return This builder for chaining.
       */
      public Builder setUserId(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000040;
        userId_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * If this event relates to a specific user (as in ``drink_poured``,
       * ``session_started``, and ``session_joined`` when the user is not
       * anonymous), this field gives the user's id.
       * </pre>
       *
       * <code>optional string user_id = 7;</code>
       * @return This builder for chaining.
       */
      public Builder clearUserId() {
        bitField0_ = (bitField0_ & ~0x00000040);
        userId_ = getDefaultInstance().getUserId();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * If this event relates to a specific user (as in ``drink_poured``,
       * ``session_started``, and ``session_joined`` when the user is not
       * anonymous), this field gives the user's id.
       * </pre>
       *
       * <code>optional string user_id = 7;</code>
       * @param value The bytes for userId to set.
       * @return This builder for chaining.
       */
      public Builder setUserIdBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000040;
        userId_ = value;
        onChanged();
        return this;
      }

      private org.kegbot.proto.Models.Image image_;
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.Image, org.kegbot.proto.Models.Image.Builder, org.kegbot.proto.Models.ImageOrBuilder> imageBuilder_;
      /**
       * <code>optional .Image image = 8;</code>
       * @return Whether the image field is set.
       */
      public boolean hasImage() {
        return ((bitField0_ & 0x00000080) != 0);
      }
      /**
       * <code>optional .Image image = 8;</code>
       * @return The image.
       */
      public org.kegbot.proto.Models.Image getImage() {
        if (imageBuilder_ == null) {
          return image_ == null ? org.kegbot.proto.Models.Image.getDefaultInstance() : image_;
        } else {
          return imageBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .Image image = 8;</code>
       */
      public Builder setImage(org.kegbot.proto.Models.Image value) {
        if (imageBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          image_ = value;
          onChanged();
        } else {
          imageBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000080;
        return this;
      }
      /**
       * <code>optional .Image image = 8;</code>
       */
      public Builder setImage(
          org.kegbot.proto.Models.Image.Builder builderForValue) {
        if (imageBuilder_ == null) {
          image_ = builderForValue.build();
          onChanged();
        } else {
          imageBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000080;
        return this;
      }
      /**
       * <code>optional .Image image = 8;</code>
       */
      public Builder mergeImage(org.kegbot.proto.Models.Image value) {
        if (imageBuilder_ == null) {
          if (((bitField0_ & 0x00000080) != 0) &&
              image_ != null &&
              image_ != org.kegbot.proto.Models.Image.getDefaultInstance()) {
            image_ =
              org.kegbot.proto.Models.Image.newBuilder(image_).mergeFrom(value).buildPartial();
          } else {
            image_ = value;
          }
          onChanged();
        } else {
          imageBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000080;
        return this;
      }
      /**
       * <code>optional .Image image = 8;</code>
       */
      public Builder clearImage() {
        if (imageBuilder_ == null) {
          image_ = null;
          onChanged();
        } else {
          imageBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000080);
        return this;
      }
      /**
       * <code>optional .Image image = 8;</code>
       */
      public org.kegbot.proto.Models.Image.Builder getImageBuilder() {
        bitField0_ |= 0x00000080;
        onChanged();
        return getImageFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .Image image = 8;</code>
       */
      public org.kegbot.proto.Models.ImageOrBuilder getImageOrBuilder() {
        if (imageBuilder_ != null) {
          return imageBuilder_.getMessageOrBuilder();
        } else {
          return image_ == null ?
              org.kegbot.proto.Models.Image.getDefaultInstance() : image_;
        }
      }
      /**
       * <code>optional .Image image = 8;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.Image, org.kegbot.proto.Models.Image.Builder, org.kegbot.proto.Models.ImageOrBuilder> 
          getImageFieldBuilder() {
        if (imageBuilder_ == null) {
          imageBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              org.kegbot.proto.Models.Image, org.kegbot.proto.Models.Image.Builder, org.kegbot.proto.Models.ImageOrBuilder>(
                  getImage(),
                  getParentForChildren(),
                  isClean());
          image_ = null;
        }
        return imageBuilder_;
      }

      private org.kegbot.proto.Models.User user_;
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.User, org.kegbot.proto.Models.User.Builder, org.kegbot.proto.Models.UserOrBuilder> userBuilder_;
      /**
       * <code>optional .User user = 9;</code>
       * @return Whether the user field is set.
       */
      public boolean hasUser() {
        return ((bitField0_ & 0x00000100) != 0);
      }
      /**
       * <code>optional .User user = 9;</code>
       * @return The user.
       */
      public org.kegbot.proto.Models.User getUser() {
        if (userBuilder_ == null) {
          return user_ == null ? org.kegbot.proto.Models.User.getDefaultInstance() : user_;
        } else {
          return userBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .User user = 9;</code>
       */
      public Builder setUser(org.kegbot.proto.Models.User value) {
        if (userBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          user_ = value;
          onChanged();
        } else {
          userBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000100;
        return this;
      }
      /**
       * <code>optional .User user = 9;</code>
       */
      public Builder setUser(
          org.kegbot.proto.Models.User.Builder builderForValue) {
        if (userBuilder_ == null) {
          user_ = builderForValue.build();
          onChanged();
        } else {
          userBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000100;
        return this;
      }
      /**
       * <code>optional .User user = 9;</code>
       */
      public Builder mergeUser(org.kegbot.proto.Models.User value) {
        if (userBuilder_ == null) {
          if (((bitField0_ & 0x00000100) != 0) &&
              user_ != null &&
              user_ != org.kegbot.proto.Models.User.getDefaultInstance()) {
            user_ =
              org.kegbot.proto.Models.User.newBuilder(user_).mergeFrom(value).buildPartial();
          } else {
            user_ = value;
          }
          onChanged();
        } else {
          userBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000100;
        return this;
      }
      /**
       * <code>optional .User user = 9;</code>
       */
      public Builder clearUser() {
        if (userBuilder_ == null) {
          user_ = null;
          onChanged();
        } else {
          userBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000100);
        return this;
      }
      /**
       * <code>optional .User user = 9;</code>
       */
      public org.kegbot.proto.Models.User.Builder getUserBuilder() {
        bitField0_ |= 0x00000100;
        onChanged();
        return getUserFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .User user = 9;</code>
       */
      public org.kegbot.proto.Models.UserOrBuilder getUserOrBuilder() {
        if (userBuilder_ != null) {
          return userBuilder_.getMessageOrBuilder();
        } else {
          return user_ == null ?
              org.kegbot.proto.Models.User.getDefaultInstance() : user_;
        }
      }
      /**
       * <code>optional .User user = 9;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.User, org.kegbot.proto.Models.User.Builder, org.kegbot.proto.Models.UserOrBuilder> 
          getUserFieldBuilder() {
        if (userBuilder_ == null) {
          userBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              org.kegbot.proto.Models.User, org.kegbot.proto.Models.User.Builder, org.kegbot.proto.Models.UserOrBuilder>(
                  getUser(),
                  getParentForChildren(),
                  isClean());
          user_ = null;
        }
        return userBuilder_;
      }

      private org.kegbot.proto.Models.Drink drink_;
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.Drink, org.kegbot.proto.Models.Drink.Builder, org.kegbot.proto.Models.DrinkOrBuilder> drinkBuilder_;
      /**
       * <code>optional .Drink drink = 10;</code>
       * @return Whether the drink field is set.
       */
      public boolean hasDrink() {
        return ((bitField0_ & 0x00000200) != 0);
      }
      /**
       * <code>optional .Drink drink = 10;</code>
       * @return The drink.
       */
      public org.kegbot.proto.Models.Drink getDrink() {
        if (drinkBuilder_ == null) {
          return drink_ == null ? org.kegbot.proto.Models.Drink.getDefaultInstance() : drink_;
        } else {
          return drinkBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .Drink drink = 10;</code>
       */
      public Builder setDrink(org.kegbot.proto.Models.Drink value) {
        if (drinkBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          drink_ = value;
          onChanged();
        } else {
          drinkBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000200;
        return this;
      }
      /**
       * <code>optional .Drink drink = 10;</code>
       */
      public Builder setDrink(
          org.kegbot.proto.Models.Drink.Builder builderForValue) {
        if (drinkBuilder_ == null) {
          drink_ = builderForValue.build();
          onChanged();
        } else {
          drinkBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000200;
        return this;
      }
      /**
       * <code>optional .Drink drink = 10;</code>
       */
      public Builder mergeDrink(org.kegbot.proto.Models.Drink value) {
        if (drinkBuilder_ == null) {
          if (((bitField0_ & 0x00000200) != 0) &&
              drink_ != null &&
              drink_ != org.kegbot.proto.Models.Drink.getDefaultInstance()) {
            drink_ =
              org.kegbot.proto.Models.Drink.newBuilder(drink_).mergeFrom(value).buildPartial();
          } else {
            drink_ = value;
          }
          onChanged();
        } else {
          drinkBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000200;
        return this;
      }
      /**
       * <code>optional .Drink drink = 10;</code>
       */
      public Builder clearDrink() {
        if (drinkBuilder_ == null) {
          drink_ = null;
          onChanged();
        } else {
          drinkBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000200);
        return this;
      }
      /**
       * <code>optional .Drink drink = 10;</code>
       */
      public org.kegbot.proto.Models.Drink.Builder getDrinkBuilder() {
        bitField0_ |= 0x00000200;
        onChanged();
        return getDrinkFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .Drink drink = 10;</code>
       */
      public org.kegbot.proto.Models.DrinkOrBuilder getDrinkOrBuilder() {
        if (drinkBuilder_ != null) {
          return drinkBuilder_.getMessageOrBuilder();
        } else {
          return drink_ == null ?
              org.kegbot.proto.Models.Drink.getDefaultInstance() : drink_;
        }
      }
      /**
       * <code>optional .Drink drink = 10;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.Drink, org.kegbot.proto.Models.Drink.Builder, org.kegbot.proto.Models.DrinkOrBuilder> 
          getDrinkFieldBuilder() {
        if (drinkBuilder_ == null) {
          drinkBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              org.kegbot.proto.Models.Drink, org.kegbot.proto.Models.Drink.Builder, org.kegbot.proto.Models.DrinkOrBuilder>(
                  getDrink(),
                  getParentForChildren(),
                  isClean());
          drink_ = null;
        }
        return drinkBuilder_;
      }

      private org.kegbot.proto.Models.Keg keg_;
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.Keg, org.kegbot.proto.Models.Keg.Builder, org.kegbot.proto.Models.KegOrBuilder> kegBuilder_;
      /**
       * <code>optional .Keg keg = 11;</code>
       * @return Whether the keg field is set.
       */
      public boolean hasKeg() {
        return ((bitField0_ & 0x00000400) != 0);
      }
      /**
       * <code>optional .Keg keg = 11;</code>
       * @return The keg.
       */
      public org.kegbot.proto.Models.Keg getKeg() {
        if (kegBuilder_ == null) {
          return keg_ == null ? org.kegbot.proto.Models.Keg.getDefaultInstance() : keg_;
        } else {
          return kegBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .Keg keg = 11;</code>
       */
      public Builder setKeg(org.kegbot.proto.Models.Keg value) {
        if (kegBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          keg_ = value;
          onChanged();
        } else {
          kegBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000400;
        return this;
      }
      /**
       * <code>optional .Keg keg = 11;</code>
       */
      public Builder setKeg(
          org.kegbot.proto.Models.Keg.Builder builderForValue) {
        if (kegBuilder_ == null) {
          keg_ = builderForValue.build();
          onChanged();
        } else {
          kegBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000400;
        return this;
      }
      /**
       * <code>optional .Keg keg = 11;</code>
       */
      public Builder mergeKeg(org.kegbot.proto.Models.Keg value) {
        if (kegBuilder_ == null) {
          if (((bitField0_ & 0x00000400) != 0) &&
              keg_ != null &&
              keg_ != org.kegbot.proto.Models.Keg.getDefaultInstance()) {
            keg_ =
              org.kegbot.proto.Models.Keg.newBuilder(keg_).mergeFrom(value).buildPartial();
          } else {
            keg_ = value;
          }
          onChanged();
        } else {
          kegBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000400;
        return this;
      }
      /**
       * <code>optional .Keg keg = 11;</code>
       */
      public Builder clearKeg() {
        if (kegBuilder_ == null) {
          keg_ = null;
          onChanged();
        } else {
          kegBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000400);
        return this;
      }
      /**
       * <code>optional .Keg keg = 11;</code>
       */
      public org.kegbot.proto.Models.Keg.Builder getKegBuilder() {
        bitField0_ |= 0x00000400;
        onChanged();
        return getKegFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .Keg keg = 11;</code>
       */
      public org.kegbot.proto.Models.KegOrBuilder getKegOrBuilder() {
        if (kegBuilder_ != null) {
          return kegBuilder_.getMessageOrBuilder();
        } else {
          return keg_ == null ?
              org.kegbot.proto.Models.Keg.getDefaultInstance() : keg_;
        }
      }
      /**
       * <code>optional .Keg keg = 11;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.Keg, org.kegbot.proto.Models.Keg.Builder, org.kegbot.proto.Models.KegOrBuilder> 
          getKegFieldBuilder() {
        if (kegBuilder_ == null) {
          kegBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              org.kegbot.proto.Models.Keg, org.kegbot.proto.Models.Keg.Builder, org.kegbot.proto.Models.KegOrBuilder>(
                  getKeg(),
                  getParentForChildren(),
                  isClean());
          keg_ = null;
        }
        return kegBuilder_;
      }

      private org.kegbot.proto.Models.Session session_;
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.Session, org.kegbot.proto.Models.Session.Builder, org.kegbot.proto.Models.SessionOrBuilder> sessionBuilder_;
      /**
       * <code>optional .Session session = 12;</code>
       * @return Whether the session field is set.
       */
      public boolean hasSession() {
        return ((bitField0_ & 0x00000800) != 0);
      }
      /**
       * <code>optional .Session session = 12;</code>
       * @return The session.
       */
      public org.kegbot.proto.Models.Session getSession() {
        if (sessionBuilder_ == null) {
          return session_ == null ? org.kegbot.proto.Models.Session.getDefaultInstance() : session_;
        } else {
          return sessionBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .Session session = 12;</code>
       */
      public Builder setSession(org.kegbot.proto.Models.Session value) {
        if (sessionBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          session_ = value;
          onChanged();
        } else {
          sessionBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000800;
        return this;
      }
      /**
       * <code>optional .Session session = 12;</code>
       */
      public Builder setSession(
          org.kegbot.proto.Models.Session.Builder builderForValue) {
        if (sessionBuilder_ == null) {
          session_ = builderForValue.build();
          onChanged();
        } else {
          sessionBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000800;
        return this;
      }
      /**
       * <code>optional .Session session = 12;</code>
       */
      public Builder mergeSession(org.kegbot.proto.Models.Session value) {
        if (sessionBuilder_ == null) {
          if (((bitField0_ & 0x00000800) != 0) &&
              session_ != null &&
              session_ != org.kegbot.proto.Models.Session.getDefaultInstance()) {
            session_ =
              org.kegbot.proto.Models.Session.newBuilder(session_).mergeFrom(value).buildPartial();
          } else {
            session_ = value;
          }
          onChanged();
        } else {
          sessionBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000800;
        return this;
      }
      /**
       * <code>optional .Session session = 12;</code>
       */
      public Builder clearSession() {
        if (sessionBuilder_ == null) {
          session_ = null;
          onChanged();
        } else {
          sessionBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000800);
        return this;
      }
      /**
       * <code>optional .Session session = 12;</code>
       */
      public org.kegbot.proto.Models.Session.Builder getSessionBuilder() {
        bitField0_ |= 0x00000800;
        onChanged();
        return getSessionFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .Session session = 12;</code>
       */
      public org.kegbot.proto.Models.SessionOrBuilder getSessionOrBuilder() {
        if (sessionBuilder_ != null) {
          return sessionBuilder_.getMessageOrBuilder();
        } else {
          return session_ == null ?
              org.kegbot.proto.Models.Session.getDefaultInstance() : session_;
        }
      }
      /**
       * <code>optional .Session session = 12;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          org.kegbot.proto.Models.Session, org.kegbot.proto.Models.Session.Builder, org.kegbot.proto.Models.SessionOrBuilder> 
          getSessionFieldBuilder() {
        if (sessionBuilder_ == null) {
          sessionBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              org.kegbot.proto.Models.Session, org.kegbot.proto.Models.Session.Builder, org.kegbot.proto.Models.SessionOrBuilder>(
                  getSession(),
                  getParentForChildren(),
                  isClean());
          session_ = null;
        }
        return sessionBuilder_;
      }
      @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:SystemEvent)
    }

    // @@protoc_insertion_point(class_scope:SystemEvent)
    private static final org.kegbot.proto.Models.SystemEvent DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new org.kegbot.proto.Models.SystemEvent();
    }

    public static org.kegbot.proto.Models.SystemEvent getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

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

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

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

    @java.lang.Override
    public org.kegbot.proto.Models.SystemEvent getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface SoundEventOrBuilder extends
      // @@protoc_insertion_point(interface_extends:SoundEvent)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <pre>
     * The name of this event.
     * </pre>
     *
     * <code>required string event_name = 1;</code>
     * @return Whether the eventName field is set.
     */
    boolean hasEventName();
    /**
     * <pre>
     * The name of this event.
     * </pre>
     *
     * <code>required string event_name = 1;</code>
     * @return The eventName.
     */
    java.lang.String getEventName();
    /**
     * <pre>
     * The name of this event.
     * </pre>
     *
     * <code>required string event_name = 1;</code>
     * @return The bytes for eventName.
     */
    com.google.protobuf.ByteString
        getEventNameBytes();

    /**
     * <pre>
     * The predicate for the event.
     * Not currently used.
     * </pre>
     *
     * <code>optional string event_predicate = 2;</code>
     * @return Whether the eventPredicate field is set.
     */
    boolean hasEventPredicate();
    /**
     * <pre>
     * The predicate for the event.
     * Not currently used.
     * </pre>
     *
     * <code>optional string event_predicate = 2;</code>
     * @return The eventPredicate.
     */
    java.lang.String getEventPredicate();
    /**
     * <pre>
     * The predicate for the event.
     * Not currently used.
     * </pre>
     *
     * <code>optional string event_predicate = 2;</code>
     * @return The bytes for eventPredicate.
     */
    com.google.protobuf.ByteString
        getEventPredicateBytes();

    /**
     * <pre>
     * The URL for the sound file to play during this event.
     * </pre>
     *
     * <code>required string sound_url = 3;</code>
     * @return Whether the soundUrl field is set.
     */
    boolean hasSoundUrl();
    /**
     * <pre>
     * The URL for the sound file to play during this event.
     * </pre>
     *
     * <code>required string sound_url = 3;</code>
     * @return The soundUrl.
     */
    java.lang.String getSoundUrl();
    /**
     * <pre>
     * The URL for the sound file to play during this event.
     * </pre>
     *
     * <code>required string sound_url = 3;</code>
     * @return The bytes for soundUrl.
     */
    com.google.protobuf.ByteString
        getSoundUrlBytes();

    /**
     * <pre>
     * A specific username that this event applies to.
     * Not currently used.
     * </pre>
     *
     * <code>optional string user = 4;</code>
     * @return Whether the user field is set.
     */
    boolean hasUser();
    /**
     * <pre>
     * A specific username that this event applies to.
     * Not currently used.
     * </pre>
     *
     * <code>optional string user = 4;</code>
     * @return The user.
     */
    java.lang.String getUser();
    /**
     * <pre>
     * A specific username that this event applies to.
     * Not currently used.
     * </pre>
     *
     * <code>optional string user = 4;</code>
     * @return The bytes for user.
     */
    com.google.protobuf.ByteString
        getUserBytes();
  }
  /**
   * <pre>
   * An administrator-defined sound file to play for certain pour events.
   * </pre>
   *
   * Protobuf type {@code SoundEvent}
   */
  public static final class SoundEvent extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:SoundEvent)
      SoundEventOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use SoundEvent.newBuilder() to construct.
    private SoundEvent(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private SoundEvent() {
      eventName_ = "";
      eventPredicate_ = "";
      soundUrl_ = "";
      user_ = "";
    }

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

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return org.kegbot.proto.Models.internal_static_SoundEvent_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return org.kegbot.proto.Models.internal_static_SoundEvent_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              org.kegbot.proto.Models.SoundEvent.class, org.kegbot.proto.Models.SoundEvent.Builder.class);
    }

    private int bitField0_;
    public static final int EVENT_NAME_FIELD_NUMBER = 1;
    private volatile java.lang.Object eventName_;
    /**
     * <pre>
     * The name of this event.
     * </pre>
     *
     * <code>required string event_name = 1;</code>
     * @return Whether the eventName field is set.
     */
    @java.lang.Override
    public boolean hasEventName() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <pre>
     * The name of this event.
     * </pre>
     *
     * <code>required string event_name = 1;</code>
     * @return The eventName.
     */
    @java.lang.Override
    public java.lang.String getEventName() {
      java.lang.Object ref = eventName_;
      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()) {
          eventName_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * The name of this event.
     * </pre>
     *
     * <code>required string event_name = 1;</code>
     * @return The bytes for eventName.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getEventNameBytes() {
      java.lang.Object ref = eventName_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        eventName_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int EVENT_PREDICATE_FIELD_NUMBER = 2;
    private volatile java.lang.Object eventPredicate_;
    /**
     * <pre>
     * The predicate for the event.
     * Not currently used.
     * </pre>
     *
     * <code>optional string event_predicate = 2;</code>
     * @return Whether the eventPredicate field is set.
     */
    @java.lang.Override
    public boolean hasEventPredicate() {
      return ((bitField0_ & 0x00000002) != 0);
    }
    /**
     * <pre>
     * The predicate for the event.
     * Not currently used.
     * </pre>
     *
     * <code>optional string event_predicate = 2;</code>
     * @return The eventPredicate.
     */
    @java.lang.Override
    public java.lang.String getEventPredicate() {
      java.lang.Object ref = eventPredicate_;
      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()) {
          eventPredicate_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * The predicate for the event.
     * Not currently used.
     * </pre>
     *
     * <code>optional string event_predicate = 2;</code>
     * @return The bytes for eventPredicate.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getEventPredicateBytes() {
      java.lang.Object ref = eventPredicate_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        eventPredicate_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int SOUND_URL_FIELD_NUMBER = 3;
    private volatile java.lang.Object soundUrl_;
    /**
     * <pre>
     * The URL for the sound file to play during this event.
     * </pre>
     *
     * <code>required string sound_url = 3;</code>
     * @return Whether the soundUrl field is set.
     */
    @java.lang.Override
    public boolean hasSoundUrl() {
      return ((bitField0_ & 0x00000004) != 0);
    }
    /**
     * <pre>
     * The URL for the sound file to play during this event.
     * </pre>
     *
     * <code>required string sound_url = 3;</code>
     * @return The soundUrl.
     */
    @java.lang.Override
    public java.lang.String getSoundUrl() {
      java.lang.Object ref = soundUrl_;
      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()) {
          soundUrl_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * The URL for the sound file to play during this event.
     * </pre>
     *
     * <code>required string sound_url = 3;</code>
     * @return The bytes for soundUrl.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getSoundUrlBytes() {
      java.lang.Object ref = soundUrl_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        soundUrl_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int USER_FIELD_NUMBER = 4;
    private volatile java.lang.Object user_;
    /**
     * <pre>
     * A specific username that this event applies to.
     * Not currently used.
     * </pre>
     *
     * <code>optional string user = 4;</code>
     * @return Whether the user field is set.
     */
    @java.lang.Override
    public boolean hasUser() {
      return ((bitField0_ & 0x00000008) != 0);
    }
    /**
     * <pre>
     * A specific username that this event applies to.
     * Not currently used.
     * </pre>
     *
     * <code>optional string user = 4;</code>
     * @return The user.
     */
    @java.lang.Override
    public java.lang.String getUser() {
      java.lang.Object ref = user_;
      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()) {
          user_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * A specific username that this event applies to.
     * Not currently used.
     * </pre>
     *
     * <code>optional string user = 4;</code>
     * @return The bytes for user.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getUserBytes() {
      java.lang.Object ref = user_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        user_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static org.kegbot.proto.Models.SoundEvent parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.SoundEvent parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.SoundEvent parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.SoundEvent parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.SoundEvent parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.kegbot.proto.Models.SoundEvent parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.kegbot.proto.Models.SoundEvent parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.SoundEvent 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 org.kegbot.proto.Models.SoundEvent parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.SoundEvent 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 org.kegbot.proto.Models.SoundEvent parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.kegbot.proto.Models.SoundEvent 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(org.kegbot.proto.Models.SoundEvent 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>
     * An administrator-defined sound file to play for certain pour events.
     * </pre>
     *
     * Protobuf type {@code SoundEvent}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:SoundEvent)
        org.kegbot.proto.Models.SoundEventOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return org.kegbot.proto.Models.internal_static_SoundEvent_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return org.kegbot.proto.Models.internal_static_SoundEvent_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                org.kegbot.proto.Models.SoundEvent.class, org.kegbot.proto.Models.SoundEvent.Builder.class);
      }

      // Construct using org.kegbot.proto.Models.SoundEvent.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();
        eventName_ = "";
        bitField0_ = (bitField0_ & ~0x00000001);
        eventPredicate_ = "";
        bitField0_ = (bitField0_ & ~0x00000002);
        soundUrl_ = "";
        bitField0_ = (bitField0_ & ~0x00000004);
        user_ = "";
        bitField0_ = (bitField0_ & ~0x00000008);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return org.kegbot.proto.Models.internal_static_SoundEvent_descriptor;
      }

      @java.lang.Override
      public org.kegbot.proto.Models.SoundEvent getDefaultInstanceForType() {
        return org.kegbot.proto.Models.SoundEvent.getDefaultInstance();
      }

      @java.lang.Override
      public org.kegbot.proto.Models.SoundEvent build() {
        org.kegbot.proto.Models.SoundEvent result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public org.kegbot.proto.Models.SoundEvent buildPartial() {
        org.kegbot.proto.Models.SoundEvent result = new org.kegbot.proto.Models.SoundEvent(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) != 0)) {
          to_bitField0_ |= 0x00000001;
        }
        result.eventName_ = eventName_;
        if (((from_bitField0_ & 0x00000002) != 0)) {
          to_bitField0_ |= 0x00000002;
        }
        result.eventPredicate_ = eventPredicate_;
        if (((from_bitField0_ & 0x00000004) != 0)) {
          to_bitField0_ |= 0x00000004;
        }
        result.soundUrl_ = soundUrl_;
        if (((from_bitField0_ & 0x00000008) != 0)) {
          to_bitField0_ |= 0x00000008;
        }
        result.user_ = user_;
        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);
      }
      private int bitField0_;

      private java.lang.Object eventName_ = "";
      /**
       * <pre>
       * The name of this event.
       * </pre>
       *
       * <code>required string event_name = 1;</code>
       * @return Whether the eventName field is set.
       */
      public boolean hasEventName() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <pre>
       * The name of this event.
       * </pre>
       *
       * <code>required string event_name = 1;</code>
       * @return The eventName.
       */
      public java.lang.String getEventName() {
        java.lang.Object ref = eventName_;
        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()) {
            eventName_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * The name of this event.
       * </pre>
       *
       * <code>required string event_name = 1;</code>
       * @return The bytes for eventName.
       */
      public com.google.protobuf.ByteString
          getEventNameBytes() {
        java.lang.Object ref = eventName_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          eventName_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * The name of this event.
       * </pre>
       *
       * <code>required string event_name = 1;</code>
       * @param value The eventName to set.
       * @return This builder for chaining.
       */
      public Builder setEventName(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
        eventName_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The name of this event.
       * </pre>
       *
       * <code>required string event_name = 1;</code>
       * @return This builder for chaining.
       */
      public Builder clearEventName() {
        bitField0_ = (bitField0_ & ~0x00000001);
        eventName_ = getDefaultInstance().getEventName();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The name of this event.
       * </pre>
       *
       * <code>required string event_name = 1;</code>
       * @param value The bytes for eventName to set.
       * @return This builder for chaining.
       */
      public Builder setEventNameBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
        eventName_ = value;
        onChanged();
        return this;
      }

      private java.lang.Object eventPredicate_ = "";
      /**
       * <pre>
       * The predicate for the event.
       * Not currently used.
       * </pre>
       *
       * <code>optional string event_predicate = 2;</code>
       * @return Whether the eventPredicate field is set.
       */
      public boolean hasEventPredicate() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <pre>
       * The predicate for the event.
       * Not currently used.
       * </pre>
       *
       * <code>optional string event_predicate = 2;</code>
       * @return The eventPredicate.
       */
      public java.lang.String getEventPredicate() {
        java.lang.Object ref = eventPredicate_;
        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()) {
            eventPredicate_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * The predicate for the event.
       * Not currently used.
       * </pre>
       *
       * <code>optional string event_predicate = 2;</code>
       * @return The bytes for eventPredicate.
       */
      public com.google.protobuf.ByteString
          getEventPredicateBytes() {
        java.lang.Object ref = eventPredicate_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          eventPredicate_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * The predicate for the event.
       * Not currently used.
       * </pre>
       *
       * <code>optional string event_predicate = 2;</code>
       * @param value The eventPredicate to set.
       * @return This builder for chaining.
       */
      public Builder setEventPredicate(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
        eventPredicate_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The predicate for the event.
       * Not currently used.
       * </pre>
       *
       * <code>optional string event_predicate = 2;</code>
       * @return This builder for chaining.
       */
      public Builder clearEventPredicate() {
        bitField0_ = (bitField0_ & ~0x00000002);
        eventPredicate_ = getDefaultInstance().getEventPredicate();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The predicate for the event.
       * Not currently used.
       * </pre>
       *
       * <code>optional string event_predicate = 2;</code>
       * @param value The bytes for eventPredicate to set.
       * @return This builder for chaining.
       */
      public Builder setEventPredicateBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
        eventPredicate_ = value;
        onChanged();
        return this;
      }

      private java.lang.Object soundUrl_ = "";
      /**
       * <pre>
       * The URL for the sound file to play during this event.
       * </pre>
       *
       * <code>required string sound_url = 3;</code>
       * @return Whether the soundUrl field is set.
       */
      public boolean hasSoundUrl() {
        return ((bitField0_ & 0x00000004) != 0);
      }
      /**
       * <pre>
       * The URL for the sound file to play during this event.
       * </pre>
       *
       * <code>required string sound_url = 3;</code>
       * @return The soundUrl.
       */
      public java.lang.String getSoundUrl() {
        java.lang.Object ref = soundUrl_;
        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()) {
            soundUrl_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * The URL for the sound file to play during this event.
       * </pre>
       *
       * <code>required string sound_url = 3;</code>
       * @return The bytes for soundUrl.
       */
      public com.google.protobuf.ByteString
          getSoundUrlBytes() {
        java.lang.Object ref = soundUrl_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          soundUrl_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * The URL for the sound file to play during this event.
       * </pre>
       *
       * <code>required string sound_url = 3;</code>
       * @param value The soundUrl to set.
       * @return This builder for chaining.
       */
      public Builder setSoundUrl(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
        soundUrl_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The URL for the sound file to play during this event.
       * </pre>
       *
       * <code>required string sound_url = 3;</code>
       * @return This builder for chaining.
       */
      public Builder clearSoundUrl() {
        bitField0_ = (bitField0_ & ~0x00000004);
        soundUrl_ = getDefaultInstance().getSoundUrl();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The URL for the sound file to play during this event.
       * </pre>
       *
       * <code>required string sound_url = 3;</code>
       * @param value The bytes for soundUrl to set.
       * @return This builder for chaining.
       */
      public Builder setSoundUrlBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
        soundUrl_ = value;
        onChanged();
        return this;
      }

      private java.lang.Object user_ = "";
      /**
       * <pre>
       * A specific username that this event applies to.
       * Not currently used.
       * </pre>
       *
       * <code>optional string user = 4;</code>
       * @return Whether the user field is set.
       */
      public boolean hasUser() {
        return ((bitField0_ & 0x00000008) != 0);
      }
      /**
       * <pre>
       * A specific username that this event applies to.
       * Not currently used.
       * </pre>
       *
       * <code>optional string user = 4;</code>
       * @return The user.
       */
      public java.lang.String getUser() {
        java.lang.Object ref = user_;
        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()) {
            user_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * A specific username that this event applies to.
       * Not currently used.
       * </pre>
       *
       * <code>optional string user = 4;</code>
       * @return The bytes for user.
       */
      public com.google.protobuf.ByteString
          getUserBytes() {
        java.lang.Object ref = user_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          user_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * A specific username that this event applies to.
       * Not currently used.
       * </pre>
       *
       * <code>optional string user = 4;</code>
       * @param value The user to set.
       * @return This builder for chaining.
       */
      public Builder setUser(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
        user_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * A specific username that this event applies to.
       * Not currently used.
       * </pre>
       *
       * <code>optional string user = 4;</code>
       * @return This builder for chaining.
       */
      public Builder clearUser() {
        bitField0_ = (bitField0_ & ~0x00000008);
        user_ = getDefaultInstance().getUser();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * A specific username that this event applies to.
       * Not currently used.
       * </pre>
       *
       * <code>optional string user = 4;</code>
       * @param value The bytes for user to set.
       * @return This builder for chaining.
       */
      public Builder setUserBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
        user_ = 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:SoundEvent)
    }

    // @@protoc_insertion_point(class_scope:SoundEvent)
    private static final org.kegbot.proto.Models.SoundEvent DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new org.kegbot.proto.Models.SoundEvent();
    }

    public static org.kegbot.proto.Models.SoundEvent getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

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

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

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

    @java.lang.Override
    public org.kegbot.proto.Models.SoundEvent getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_AuthenticationToken_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_AuthenticationToken_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_BeverageProducer_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_BeverageProducer_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_Beverage_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_Beverage_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_BeerStyle_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_BeerStyle_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_BeerType_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_BeerType_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_Brewer_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_Brewer_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_Drink_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_Drink_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_Image_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_Image_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_Keg_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_Keg_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_KegSize_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_KegSize_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_Controller_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_Controller_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_FlowMeter_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_FlowMeter_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_FlowToggle_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_FlowToggle_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_KegTap_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_KegTap_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_Session_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_Session_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_ThermoLog_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_ThermoLog_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_ThermoSensor_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_ThermoSensor_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_User_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_User_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_SiteInfo_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_SiteInfo_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_SystemEvent_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_SystemEvent_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_SoundEvent_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_SoundEvent_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\014models.proto\"\316\001\n\023AuthenticationToken\022\n" +
      "\n\002id\030\001 \002(\r\022\023\n\013auth_device\030\002 \002(\t\022\023\n\013token" +
      "_value\030\003 \002(\t\022\020\n\010username\030\004 \001(\t\022\021\n\tnice_n" +
      "ame\030\005 \001(\t\022\017\n\007enabled\030\006 \001(\010\022\024\n\014created_ti" +
      "me\030\007 \002(\t\022\023\n\013expire_time\030\010 \001(\t\022\013\n\003pin\030\t \001" +
      "(\t\022\023\n\004user\030\n \001(\0132\005.User\"\270\001\n\020BeverageProd" +
      "ucer\022\n\n\002id\030\001 \002(\r\022\014\n\004name\030\002 \002(\t\022\017\n\007countr" +
      "y\030\003 \001(\t\022\024\n\014origin_state\030\004 \001(\t\022\023\n\013origin_" +
      "city\030\005 \001(\t\022\023\n\013is_homebrew\030\006 \001(\010\022\013\n\003url\030\007" +
      " \001(\t\022\023\n\013description\030\010 \001(\t\022\027\n\007picture\030\t \001" +
      "(\0132\006.Image\"\270\003\n\010Beverage\022\n\n\002id\030\001 \002(\r\022\014\n\004n" +
      "ame\030\002 \002(\t\022#\n\010producer\030\003 \002(\0132\021.BeveragePr" +
      "oducer\022\025\n\rbeverage_type\030\004 \002(\t\022\r\n\005style\030\005" +
      " \001(\t\022\023\n\013description\030\006 \001(\t\022\027\n\007picture\030\007 \001" +
      "(\0132\006.Image\022\024\n\014vintage_year\030\010 \001(\r\022\023\n\013abv_" +
      "percent\030\t \001(\001\022\027\n\017calories_per_ml\030\n \001(\001\022\024" +
      "\n\014carbs_per_ml\030\013 \001(\001\022\030\n\020original_gravity" +
      "\030\014 \001(\001\022\030\n\020specific_gravity\030\r \001(\001\022\022\n\nunta" +
      "ppd_id\030\016 \001(\t\022\030\n\020beverage_backend\030\017 \001(\t\022\033" +
      "\n\023beverage_backend_id\030\020 \001(\t\022\021\n\tcolor_hex" +
      "\030\021 \001(\t\022\013\n\003srm\030\022 \001(\001\022\013\n\003ibu\030\023 \001(\001\022\023\n\013star" +
      "_rating\030\024 \001(\001\"%\n\tBeerStyle\022\n\n\002id\030\001 \002(\r\022\014" +
      "\n\004name\030\002 \002(\t\"\331\001\n\010BeerType\022\n\n\002id\030\001 \002(\t\022\014\n" +
      "\004name\030\002 \002(\t\022\021\n\tbrewer_id\030\003 \002(\t\022\020\n\010style_" +
      "id\030\004 \002(\t\022\017\n\007edition\030\006 \001(\t\022\013\n\003abv\030\007 \001(\001\022\023" +
      "\n\013calories_oz\030\010 \001(\001\022\020\n\010carbs_oz\030\t \001(\001\022\030\n" +
      "\020specific_gravity\030\n \001(\001\022\030\n\020original_grav" +
      "ity\030\013 \001(\001\022\025\n\005image\030\014 \001(\0132\006.Image\"\267\001\n\006Bre" +
      "wer\022\n\n\002id\030\001 \002(\t\022\014\n\004name\030\002 \002(\t\022\021\n\007country" +
      "\030\003 \001(\t:\000\022\026\n\014origin_state\030\004 \001(\t:\000\022\025\n\013orig" +
      "in_city\030\005 \001(\t:\000\022\024\n\nproduction\030\006 \001(\t:\000\022\r\n" +
      "\003url\030\007 \001(\t:\000\022\025\n\013description\030\010 \001(\t:\000\022\025\n\005i" +
      "mage\030\t \001(\0132\006.Image\"\262\002\n\005Drink\022\n\n\002id\030\001 \002(\r" +
      "\022\r\n\005ticks\030\002 \002(\r\022\021\n\tvolume_ml\030\003 \002(\001\022\022\n\nse" +
      "ssion_id\030\004 \002(\r\022\014\n\004time\030\005 \002(\t\022\020\n\010duration" +
      "\030\006 \001(\r\022\016\n\006keg_id\030\010 \001(\r\022\017\n\007user_id\030\t \001(\t\022" +
      "\025\n\rauth_token_id\030\n \001(\r\022\013\n\003url\030\013 \001(\t\022\r\n\005s" +
      "hout\030\014 \001(\t\022\023\n\004user\030\r \001(\0132\005.User\022\021\n\003keg\030\016" +
      " \001(\0132\004.Keg\022\031\n\007session\030\017 \001(\0132\010.Session\022\026\n" +
      "\006images\030\020 \003(\0132\006.Image\022\030\n\020tick_time_serie" +
      "s\030\021 \001(\t\"\341\001\n\005Image\022\013\n\003url\030\001 \002(\t\022\r\n\005width\030" +
      "\002 \001(\r\022\016\n\006height\030\003 \001(\r\022\014\n\004time\030\004 \001(\t\022\017\n\007c" +
      "aption\030\005 \001(\t\022\017\n\007user_id\030\006 \001(\t\022\016\n\006keg_id\030" +
      "\007 \001(\r\022\022\n\nsession_id\030\010 \001(\r\022\020\n\010drink_id\030\t " +
      "\001(\r\022\025\n\rthumbnail_url\030\n \001(\t\022\024\n\014original_u" +
      "rl\030\013 \001(\t\022\031\n\021small_resized_url\030\r \001(\t\"\225\004\n\003" +
      "Keg\022\n\n\002id\030\001 \002(\r\022\020\n\010keg_type\030\002 \002(\t\022\033\n\023rem" +
      "aining_volume_ml\030\003 \002(\001\022\026\n\016full_volume_ml" +
      "\030\004 \002(\001\022\030\n\020served_volume_ml\030\005 \002(\001\022\031\n\021spil" +
      "led_volume_ml\030\006 \002(\001\022\024\n\014percent_full\030\007 \002(" +
      "\001\022\022\n\nstart_time\030\010 \001(\t\022\020\n\010end_time\030\t \001(\t\022" +
      "\016\n\006online\030\n \001(\010\022\023\n\013description\030\013 \001(\t\022\033\n\010" +
      "beverage\030\014 \001(\0132\t.Beverage\022\030\n\020illustratio" +
      "n_url\030\025 \001(\t\022\"\n\032illustration_thumbnail_ur" +
      "l\030\026 \001(\t\022\033\n\004type\030\r \001(\0132\t.BeerTypeB\002\030\001\022\023\n\007" +
      "type_id\030\016 \001(\tB\002\030\001\022\023\n\007size_id\030\017 \001(\rB\002\030\001\022\032" +
      "\n\004size\030\020 \001(\0132\010.KegSizeB\002\030\001\022\025\n\tsize_name\030" +
      "\021 \001(\tB\002\030\001\022\032\n\016size_volume_ml\030\022 \001(\001B\002\030\001\022\034\n" +
      "\020volume_ml_remain\030\023 \001(\001B\002\030\001\022\026\n\nspilled_m" +
      "l\030\024 \001(\001B\002\030\001\"6\n\007KegSize\022\n\n\002id\030\001 \002(\r\022\014\n\004na" +
      "me\030\002 \002(\t\022\021\n\tvolume_ml\030\003 \002(\001\"Q\n\nControlle" +
      "r\022\n\n\002id\030\001 \002(\r\022\014\n\004name\030\002 \002(\t\022\022\n\nmodel_nam" +
      "e\030\003 \001(\t\022\025\n\rserial_number\030\004 \001(\t\"o\n\tFlowMe" +
      "ter\022\n\n\002id\030\001 \002(\r\022\014\n\004name\030\002 \002(\t\022\021\n\tport_na" +
      "me\030\003 \002(\t\022\024\n\014ticks_per_ml\030\004 \002(\001\022\037\n\ncontro" +
      "ller\030\005 \001(\0132\013.Controller\"Z\n\nFlowToggle\022\n\n" +
      "\002id\030\001 \002(\r\022\014\n\004name\030\002 \002(\t\022\021\n\tport_name\030\003 \002" +
      "(\t\022\037\n\ncontroller\030\004 \001(\0132\013.Controller\"\340\002\n\006" +
      "KegTap\022\n\n\002id\030\001 \002(\r\022\014\n\004name\030\002 \002(\t\022\026\n\nmete" +
      "r_name\030\003 \001(\tB\002\030\001\022\031\n\005meter\030\014 \001(\0132\n.FlowMe" +
      "ter\022\033\n\006toggle\030\r \001(\0132\013.FlowToggle\022$\n\rther" +
      "mo_sensor\030\016 \001(\0132\r.ThermoSensor\022\022\n\nrelay_" +
      "name\030\004 \001(\t\022\023\n\013ml_per_tick\030\005 \001(\001\022\023\n\013descr" +
      "iption\030\006 \001(\t\022\030\n\020thermo_sensor_id\030\010 \001(\r\022$" +
      "\n\020last_temperature\030\t \001(\0132\n.ThermoLog\022\026\n\016" +
      "current_keg_id\030\n \001(\r\022\031\n\013current_keg\030\013 \001(" +
      "\0132\004.Keg\022\025\n\nsort_order\030\017 \001(\r:\0010\"\216\001\n\007Sessi" +
      "on\022\n\n\002id\030\001 \002(\r\022\022\n\nstart_time\030\002 \002(\t\022\020\n\010en" +
      "d_time\030\003 \002(\t\022\021\n\tvolume_ml\030\004 \002(\001\022\014\n\004name\030" +
      "\005 \001(\t\022\020\n\004slug\030\006 \001(\tB\002\030\001\022\013\n\003url\030\007 \001(\t\022\021\n\t" +
      "is_active\030\010 \001(\010\"O\n\tThermoLog\022\n\n\002id\030\001 \002(\r" +
      "\022\021\n\tsensor_id\030\002 \002(\r\022\025\n\rtemperature_c\030\003 \002" +
      "(\001\022\014\n\004time\030\004 \002(\t\"\216\001\n\014ThermoSensor\022\n\n\002id\030" +
      "\001 \002(\r\022\023\n\013sensor_name\030\002 \002(\t\022\021\n\tnice_name\030" +
      "\003 \001(\t\022\034\n\010last_log\030\006 \001(\0132\n.ThermoLog\022\025\n\tl" +
      "ast_temp\030\004 \001(\001B\002\030\001\022\025\n\tlast_time\030\005 \001(\tB\002\030" +
      "\001\"\204\002\n\004User\022\020\n\010username\030\001 \002(\t\022\024\n\014display_" +
      "name\030\r \001(\t\022\025\n\005image\030\002 \001(\0132\006.Image\022\027\n\tis_" +
      "active\030\003 \002(\010:\004true\022\022\n\nfirst_name\030\004 \001(\t\022\021" +
      "\n\tlast_name\030\005 \001(\t\022\r\n\005email\030\006 \001(\t\022\020\n\010pass" +
      "word\030\007 \001(\t\022\020\n\010is_staff\030\010 \001(\010\022\024\n\014is_super" +
      "user\030\t \001(\010\022\022\n\nlast_login\030\n \001(\t\022\023\n\013date_j" +
      "oined\030\013 \001(\t\022\013\n\003url\030\014 \001(\t\"1\n\010SiteInfo\022\r\n\005" +
      "title\030\001 \001(\t\022\026\n\016server_version\030\002 \001(\t\"\355\001\n\013" +
      "SystemEvent\022\n\n\002id\030\001 \002(\r\022\014\n\004kind\030\002 \002(\t\022\014\n" +
      "\004time\030\003 \002(\t\022\020\n\010drink_id\030\004 \001(\r\022\016\n\006keg_id\030" +
      "\005 \001(\r\022\022\n\nsession_id\030\006 \001(\r\022\017\n\007user_id\030\007 \001" +
      "(\t\022\025\n\005image\030\010 \001(\0132\006.Image\022\023\n\004user\030\t \001(\0132" +
      "\005.User\022\025\n\005drink\030\n \001(\0132\006.Drink\022\021\n\003keg\030\013 \001" +
      "(\0132\004.Keg\022\031\n\007session\030\014 \001(\0132\010.Session\"Z\n\nS" +
      "oundEvent\022\022\n\nevent_name\030\001 \002(\t\022\027\n\017event_p" +
      "redicate\030\002 \001(\t\022\021\n\tsound_url\030\003 \002(\t\022\014\n\004use" +
      "r\030\004 \001(\tB\024\n\020org.kegbot.protoH\002"
    };
    descriptor = com.google.protobuf.Descriptors.FileDescriptor
      .internalBuildGeneratedFileFrom(descriptorData,
        new com.google.protobuf.Descriptors.FileDescriptor[] {
        });
    internal_static_AuthenticationToken_descriptor =
      getDescriptor().getMessageTypes().get(0);
    internal_static_AuthenticationToken_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_AuthenticationToken_descriptor,
        new java.lang.String[] { "Id", "AuthDevice", "TokenValue", "Username", "NiceName", "Enabled", "CreatedTime", "ExpireTime", "Pin", "User", });
    internal_static_BeverageProducer_descriptor =
      getDescriptor().getMessageTypes().get(1);
    internal_static_BeverageProducer_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_BeverageProducer_descriptor,
        new java.lang.String[] { "Id", "Name", "Country", "OriginState", "OriginCity", "IsHomebrew", "Url", "Description", "Picture", });
    internal_static_Beverage_descriptor =
      getDescriptor().getMessageTypes().get(2);
    internal_static_Beverage_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_Beverage_descriptor,
        new java.lang.String[] { "Id", "Name", "Producer", "BeverageType", "Style", "Description", "Picture", "VintageYear", "AbvPercent", "CaloriesPerMl", "CarbsPerMl", "OriginalGravity", "SpecificGravity", "UntappdId", "BeverageBackend", "BeverageBackendId", "ColorHex", "Srm", "Ibu", "StarRating", });
    internal_static_BeerStyle_descriptor =
      getDescriptor().getMessageTypes().get(3);
    internal_static_BeerStyle_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_BeerStyle_descriptor,
        new java.lang.String[] { "Id", "Name", });
    internal_static_BeerType_descriptor =
      getDescriptor().getMessageTypes().get(4);
    internal_static_BeerType_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_BeerType_descriptor,
        new java.lang.String[] { "Id", "Name", "BrewerId", "StyleId", "Edition", "Abv", "CaloriesOz", "CarbsOz", "SpecificGravity", "OriginalGravity", "Image", });
    internal_static_Brewer_descriptor =
      getDescriptor().getMessageTypes().get(5);
    internal_static_Brewer_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_Brewer_descriptor,
        new java.lang.String[] { "Id", "Name", "Country", "OriginState", "OriginCity", "Production", "Url", "Description", "Image", });
    internal_static_Drink_descriptor =
      getDescriptor().getMessageTypes().get(6);
    internal_static_Drink_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_Drink_descriptor,
        new java.lang.String[] { "Id", "Ticks", "VolumeMl", "SessionId", "Time", "Duration", "KegId", "UserId", "AuthTokenId", "Url", "Shout", "User", "Keg", "Session", "Images", "TickTimeSeries", });
    internal_static_Image_descriptor =
      getDescriptor().getMessageTypes().get(7);
    internal_static_Image_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_Image_descriptor,
        new java.lang.String[] { "Url", "Width", "Height", "Time", "Caption", "UserId", "KegId", "SessionId", "DrinkId", "ThumbnailUrl", "OriginalUrl", "SmallResizedUrl", });
    internal_static_Keg_descriptor =
      getDescriptor().getMessageTypes().get(8);
    internal_static_Keg_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_Keg_descriptor,
        new java.lang.String[] { "Id", "KegType", "RemainingVolumeMl", "FullVolumeMl", "ServedVolumeMl", "SpilledVolumeMl", "PercentFull", "StartTime", "EndTime", "Online", "Description", "Beverage", "IllustrationUrl", "IllustrationThumbnailUrl", "Type", "TypeId", "SizeId", "Size", "SizeName", "SizeVolumeMl", "VolumeMlRemain", "SpilledMl", });
    internal_static_KegSize_descriptor =
      getDescriptor().getMessageTypes().get(9);
    internal_static_KegSize_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_KegSize_descriptor,
        new java.lang.String[] { "Id", "Name", "VolumeMl", });
    internal_static_Controller_descriptor =
      getDescriptor().getMessageTypes().get(10);
    internal_static_Controller_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_Controller_descriptor,
        new java.lang.String[] { "Id", "Name", "ModelName", "SerialNumber", });
    internal_static_FlowMeter_descriptor =
      getDescriptor().getMessageTypes().get(11);
    internal_static_FlowMeter_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_FlowMeter_descriptor,
        new java.lang.String[] { "Id", "Name", "PortName", "TicksPerMl", "Controller", });
    internal_static_FlowToggle_descriptor =
      getDescriptor().getMessageTypes().get(12);
    internal_static_FlowToggle_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_FlowToggle_descriptor,
        new java.lang.String[] { "Id", "Name", "PortName", "Controller", });
    internal_static_KegTap_descriptor =
      getDescriptor().getMessageTypes().get(13);
    internal_static_KegTap_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_KegTap_descriptor,
        new java.lang.String[] { "Id", "Name", "MeterName", "Meter", "Toggle", "ThermoSensor", "RelayName", "MlPerTick", "Description", "ThermoSensorId", "LastTemperature", "CurrentKegId", "CurrentKeg", "SortOrder", });
    internal_static_Session_descriptor =
      getDescriptor().getMessageTypes().get(14);
    internal_static_Session_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_Session_descriptor,
        new java.lang.String[] { "Id", "StartTime", "EndTime", "VolumeMl", "Name", "Slug", "Url", "IsActive", });
    internal_static_ThermoLog_descriptor =
      getDescriptor().getMessageTypes().get(15);
    internal_static_ThermoLog_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_ThermoLog_descriptor,
        new java.lang.String[] { "Id", "SensorId", "TemperatureC", "Time", });
    internal_static_ThermoSensor_descriptor =
      getDescriptor().getMessageTypes().get(16);
    internal_static_ThermoSensor_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_ThermoSensor_descriptor,
        new java.lang.String[] { "Id", "SensorName", "NiceName", "LastLog", "LastTemp", "LastTime", });
    internal_static_User_descriptor =
      getDescriptor().getMessageTypes().get(17);
    internal_static_User_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_User_descriptor,
        new java.lang.String[] { "Username", "DisplayName", "Image", "IsActive", "FirstName", "LastName", "Email", "Password", "IsStaff", "IsSuperuser", "LastLogin", "DateJoined", "Url", });
    internal_static_SiteInfo_descriptor =
      getDescriptor().getMessageTypes().get(18);
    internal_static_SiteInfo_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_SiteInfo_descriptor,
        new java.lang.String[] { "Title", "ServerVersion", });
    internal_static_SystemEvent_descriptor =
      getDescriptor().getMessageTypes().get(19);
    internal_static_SystemEvent_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_SystemEvent_descriptor,
        new java.lang.String[] { "Id", "Kind", "Time", "DrinkId", "KegId", "SessionId", "UserId", "Image", "User", "Drink", "Keg", "Session", });
    internal_static_SoundEvent_descriptor =
      getDescriptor().getMessageTypes().get(20);
    internal_static_SoundEvent_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_SoundEvent_descriptor,
        new java.lang.String[] { "EventName", "EventPredicate", "SoundUrl", "User", });
  }

  // @@protoc_insertion_point(outer_class_scope)
}
