// Signature format: 4.0
package androidx.room {

  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface AutoMigration {
    method public abstract int from();
    method public abstract kotlin.reflect.KClass<?> spec() default java.lang.Object;
    method public abstract int to();
    property public abstract int from;
    property public abstract kotlin.reflect.KClass<?> spec;
    property public abstract int to;
  }

  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={}) public @interface BuiltInTypeConverters {
    method public abstract androidx.room.BuiltInTypeConverters.State enums() default androidx.room.BuiltInTypeConverters.State.INHERITED;
    method public abstract androidx.room.BuiltInTypeConverters.State uuid() default androidx.room.BuiltInTypeConverters.State.INHERITED;
    property public abstract androidx.room.BuiltInTypeConverters.State enums;
    property public abstract androidx.room.BuiltInTypeConverters.State uuid;
  }

  public enum BuiltInTypeConverters.State {
    enum_constant public static final androidx.room.BuiltInTypeConverters.State DISABLED;
    enum_constant public static final androidx.room.BuiltInTypeConverters.State ENABLED;
    enum_constant public static final androidx.room.BuiltInTypeConverters.State INHERITED;
  }

  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.FUNCTION}) public @interface ColumnInfo {
    method public abstract int collate() default androidx.room.ColumnInfo.UNSPECIFIED;
    method public abstract String defaultValue() default androidx.room.ColumnInfo.VALUE_UNSPECIFIED;
    method public abstract boolean index() default false;
    method public abstract String name() default androidx.room.ColumnInfo.INHERIT_FIELD_NAME;
    method public abstract int typeAffinity() default androidx.room.ColumnInfo.UNDEFINED;
    property public abstract int collate;
    property public abstract String defaultValue;
    property public abstract boolean index;
    property public abstract String name;
    property public abstract int typeAffinity;
    field public static final int BINARY = 2; // 0x2
    field public static final int BLOB = 5; // 0x5
    field public static final androidx.room.ColumnInfo.Companion Companion;
    field public static final String INHERIT_FIELD_NAME = "[field-name]";
    field public static final int INTEGER = 3; // 0x3
    field @RequiresApi(21) public static final int LOCALIZED = 5; // 0x5
    field public static final int NOCASE = 3; // 0x3
    field public static final int REAL = 4; // 0x4
    field public static final int RTRIM = 4; // 0x4
    field public static final int TEXT = 2; // 0x2
    field public static final int UNDEFINED = 1; // 0x1
    field @RequiresApi(21) public static final int UNICODE = 6; // 0x6
    field public static final int UNSPECIFIED = 1; // 0x1
    field public static final String VALUE_UNSPECIFIED = "[value-unspecified]";
  }

  @IntDef({androidx.room.ColumnInfo.UNSPECIFIED, androidx.room.ColumnInfo.BINARY, androidx.room.ColumnInfo.NOCASE, androidx.room.ColumnInfo.RTRIM, androidx.room.ColumnInfo.LOCALIZED, androidx.room.ColumnInfo.UNICODE}) @RequiresApi(21) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public static @interface ColumnInfo.Collate {
  }

  public static final class ColumnInfo.Companion {
    field public static final int BINARY = 2; // 0x2
    field public static final int BLOB = 5; // 0x5
    field public static final String INHERIT_FIELD_NAME = "[field-name]";
    field public static final int INTEGER = 3; // 0x3
    field @RequiresApi(21) public static final int LOCALIZED = 5; // 0x5
    field public static final int NOCASE = 3; // 0x3
    field public static final int REAL = 4; // 0x4
    field public static final int RTRIM = 4; // 0x4
    field public static final int TEXT = 2; // 0x2
    field public static final int UNDEFINED = 1; // 0x1
    field @RequiresApi(21) public static final int UNICODE = 6; // 0x6
    field public static final int UNSPECIFIED = 1; // 0x1
    field public static final String VALUE_UNSPECIFIED = "[value-unspecified]";
  }

  @IntDef({androidx.room.ColumnInfo.UNDEFINED, androidx.room.ColumnInfo.TEXT, androidx.room.ColumnInfo.INTEGER, androidx.room.ColumnInfo.REAL, androidx.room.ColumnInfo.BLOB}) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public static @interface ColumnInfo.SQLiteTypeAffinity {
  }

  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface Dao {
  }

  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface Database {
    method public abstract androidx.room.AutoMigration[] autoMigrations();
    method public abstract kotlin.reflect.KClass<?>[] entities();
    method public abstract boolean exportSchema() default true;
    method public abstract int version();
    method public abstract kotlin.reflect.KClass<?>[] views();
    property public abstract androidx.room.AutoMigration![] autoMigrations;
    property public abstract kotlin.reflect.KClass<?>![] entities;
    property public abstract boolean exportSchema;
    property public abstract int version;
    property public abstract kotlin.reflect.KClass<?>![] views;
  }

  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface DatabaseView {
    method public abstract String value() default "";
    method public abstract String viewName() default "";
    property public abstract String value;
    property public abstract String viewName;
  }

  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.FUNCTION) public @interface Delete {
    method public abstract kotlin.reflect.KClass<?> entity() default java.lang.Object;
    property public abstract kotlin.reflect.KClass<?> entity;
  }

  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface DeleteColumn {
    method public abstract String columnName();
    method public abstract String tableName();
    property public abstract String columnName;
    property public abstract String tableName;
  }

  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public static @interface DeleteColumn.Entries {
    method public abstract androidx.room.DeleteColumn[] value();
    property public abstract androidx.room.DeleteColumn![] value;
  }

  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface DeleteTable {
    method public abstract String tableName();
    property public abstract String tableName;
  }

  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public static @interface DeleteTable.Entries {
    method public abstract androidx.room.DeleteTable[] value();
    property public abstract androidx.room.DeleteTable![] value;
  }

  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.FUNCTION}) public @interface Embedded {
    method public abstract String prefix() default "";
    property public abstract String prefix;
  }

  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface Entity {
    method public abstract androidx.room.ForeignKey[] foreignKeys();
    method public abstract String[] ignoredColumns();
    method public abstract androidx.room.Index[] indices();
    method public abstract boolean inheritSuperIndices() default false;
    method public abstract String[] primaryKeys();
    method public abstract String tableName() default "";
    property public abstract androidx.room.ForeignKey![] foreignKeys;
    property public abstract String![] ignoredColumns;
    property public abstract androidx.room.Index![] indices;
    property public abstract boolean inheritSuperIndices;
    property public abstract String![] primaryKeys;
    property public abstract String tableName;
  }

  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={}) public @interface ForeignKey {
    method public abstract String[] childColumns();
    method public abstract boolean deferred() default false;
    method public abstract kotlin.reflect.KClass<?> entity();
    method public abstract int onDelete() default androidx.room.ForeignKey.NO_ACTION;
    method public abstract int onUpdate() default androidx.room.ForeignKey.NO_ACTION;
    method public abstract String[] parentColumns();
    property public abstract String![] childColumns;
    property public abstract boolean deferred;
    property public abstract kotlin.reflect.KClass<?> entity;
    property public abstract int onDelete;
    property public abstract int onUpdate;
    property public abstract String![] parentColumns;
    field public static final int CASCADE = 5; // 0x5
    field public static final androidx.room.ForeignKey.Companion Companion;
    field public static final int NO_ACTION = 1; // 0x1
    field public static final int RESTRICT = 2; // 0x2
    field public static final int SET_DEFAULT = 4; // 0x4
    field public static final int SET_NULL = 3; // 0x3
  }

  @IntDef({androidx.room.ForeignKey.NO_ACTION, androidx.room.ForeignKey.RESTRICT, androidx.room.ForeignKey.SET_NULL, androidx.room.ForeignKey.SET_DEFAULT, androidx.room.ForeignKey.CASCADE}) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public static @interface ForeignKey.Action {
  }

  public static final class ForeignKey.Companion {
    field public static final int CASCADE = 5; // 0x5
    field public static final int NO_ACTION = 1; // 0x1
    field public static final int RESTRICT = 2; // 0x2
    field public static final int SET_DEFAULT = 4; // 0x4
    field public static final int SET_NULL = 3; // 0x3
  }

  @RequiresApi(16) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface Fts3 {
    method public abstract String tokenizer() default androidx.room.FtsOptions.TOKENIZER_SIMPLE;
    method public abstract String[] tokenizerArgs();
    property public abstract String tokenizer;
    property public abstract String![] tokenizerArgs;
  }

  @RequiresApi(16) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface Fts4 {
    method public abstract kotlin.reflect.KClass<?> contentEntity() default java.lang.Object;
    method public abstract String languageId() default "";
    method public abstract androidx.room.FtsOptions.MatchInfo matchInfo() default androidx.room.FtsOptions.MatchInfo.FTS4;
    method public abstract String[] notIndexed();
    method public abstract androidx.room.FtsOptions.Order order() default androidx.room.FtsOptions.Order.ASC;
    method public abstract int[] prefix();
    method public abstract String tokenizer() default androidx.room.FtsOptions.TOKENIZER_SIMPLE;
    method public abstract String[] tokenizerArgs();
    property public abstract kotlin.reflect.KClass<?> contentEntity;
    property public abstract String languageId;
    property public abstract androidx.room.FtsOptions.MatchInfo matchInfo;
    property public abstract String![] notIndexed;
    property public abstract androidx.room.FtsOptions.Order order;
    property public abstract int[] prefix;
    property public abstract String tokenizer;
    property public abstract String![] tokenizerArgs;
  }

  public final class FtsOptions {
    field public static final androidx.room.FtsOptions INSTANCE;
    field public static final String TOKENIZER_ICU = "icu";
    field public static final String TOKENIZER_PORTER = "porter";
    field public static final String TOKENIZER_SIMPLE = "simple";
    field @RequiresApi(21) public static final String TOKENIZER_UNICODE61 = "unicode61";
  }

  public enum FtsOptions.MatchInfo {
    enum_constant public static final androidx.room.FtsOptions.MatchInfo FTS3;
    enum_constant public static final androidx.room.FtsOptions.MatchInfo FTS4;
  }

  public enum FtsOptions.Order {
    enum_constant public static final androidx.room.FtsOptions.Order ASC;
    enum_constant public static final androidx.room.FtsOptions.Order DESC;
  }

  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.CONSTRUCTOR}) public @interface Ignore {
  }

  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={}) public @interface Index {
    method public abstract String name() default "";
    method public abstract androidx.room.Index.Order[] orders();
    method public abstract boolean unique() default false;
    method public abstract String[] value();
    property public abstract String name;
    property public abstract androidx.room.Index.Order![] orders;
    property public abstract boolean unique;
    property public abstract String![] value;
  }

  public enum Index.Order {
    enum_constant public static final androidx.room.Index.Order ASC;
    enum_constant public static final androidx.room.Index.Order DESC;
  }

  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.FUNCTION) public @interface Insert {
    method public abstract kotlin.reflect.KClass<?> entity() default java.lang.Object;
    method public abstract int onConflict() default androidx.room.OnConflictStrategy.ABORT;
    property public abstract kotlin.reflect.KClass<?> entity;
    property public abstract int onConflict;
  }

  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={}) public @interface Junction {
    method public abstract String entityColumn() default "";
    method public abstract String parentColumn() default "";
    method public abstract kotlin.reflect.KClass<?> value();
    property public abstract String entityColumn;
    property public abstract String parentColumn;
    property public abstract kotlin.reflect.KClass<?> value;
  }

  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.FUNCTION) public @interface MapInfo {
    method public abstract String keyColumn() default "";
    method public abstract String valueColumn() default "";
    property public abstract String keyColumn;
    property public abstract String valueColumn;
  }

  @IntDef({androidx.room.OnConflictStrategy.REPLACE, androidx.room.OnConflictStrategy.ROLLBACK, androidx.room.OnConflictStrategy.ABORT, androidx.room.OnConflictStrategy.FAIL, androidx.room.OnConflictStrategy.IGNORE}) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public @interface OnConflictStrategy {
    field public static final int ABORT = 3; // 0x3
    field public static final androidx.room.OnConflictStrategy.Companion Companion;
    field @Deprecated public static final int FAIL = 4; // 0x4
    field public static final int IGNORE = 5; // 0x5
    field public static final int REPLACE = 1; // 0x1
    field @Deprecated public static final int ROLLBACK = 2; // 0x2
  }

  public static final class OnConflictStrategy.Companion {
    field public static final int ABORT = 3; // 0x3
    field @Deprecated public static final int FAIL = 4; // 0x4
    field public static final int IGNORE = 5; // 0x5
    field public static final int REPLACE = 1; // 0x1
    field @Deprecated public static final int ROLLBACK = 2; // 0x2
  }

  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.FUNCTION}) public @interface PrimaryKey {
    method public abstract boolean autoGenerate() default false;
    property public abstract boolean autoGenerate;
  }

  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface ProvidedAutoMigrationSpec {
  }

  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface ProvidedTypeConverter {
  }

  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER}) public @interface Query {
    method public abstract String value();
    property public abstract String value;
  }

  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.FUNCTION) public @interface RawQuery {
    method public abstract kotlin.reflect.KClass<?>[] observedEntities();
    property public abstract kotlin.reflect.KClass<?>![] observedEntities;
  }

  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.FUNCTION}) public @interface Relation {
    method public abstract androidx.room.Junction associateBy() default androidx.room.Junction(java.lang.Object);
    method public abstract kotlin.reflect.KClass<?> entity() default java.lang.Object;
    method public abstract String entityColumn();
    method public abstract String parentColumn();
    method public abstract String[] projection();
    property public abstract androidx.room.Junction associateBy;
    property public abstract kotlin.reflect.KClass<?> entity;
    property public abstract String entityColumn;
    property public abstract String parentColumn;
    property public abstract String![] projection;
  }

  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface RenameColumn {
    method public abstract String fromColumnName();
    method public abstract String tableName();
    method public abstract String toColumnName();
    property public abstract String fromColumnName;
    property public abstract String tableName;
    property public abstract String toColumnName;
  }

  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public static @interface RenameColumn.Entries {
    method public abstract androidx.room.RenameColumn[] value();
    property public abstract androidx.room.RenameColumn![] value;
  }

  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface RenameTable {
    method public abstract String fromTableName();
    method public abstract String toTableName();
    property public abstract String fromTableName;
    property public abstract String toTableName;
  }

  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public static @interface RenameTable.Entries {
    method public abstract androidx.room.RenameTable[] value();
    property public abstract androidx.room.RenameTable![] value;
  }

  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.CLASS}) public @interface RewriteQueriesToDropUnusedColumns {
  }

  public class RoomWarnings {
    ctor @Deprecated public RoomWarnings();
    field public static final String CANNOT_CREATE_VERIFICATION_DATABASE = "ROOM_CANNOT_CREATE_VERIFICATION_DATABASE";
    field public static final String CURSOR_MISMATCH = "ROOM_CURSOR_MISMATCH";
    field public static final androidx.room.RoomWarnings.Companion Companion;
    field public static final String DEFAULT_CONSTRUCTOR = "ROOM_DEFAULT_CONSTRUCTOR";
    field public static final String DOES_NOT_IMPLEMENT_EQUALS_HASHCODE = "ROOM_TYPE_DOES_NOT_IMPLEMENT_EQUALS_HASHCODE";
    field public static final String INDEX_FROM_EMBEDDED_ENTITY_IS_DROPPED = "ROOM_EMBEDDED_ENTITY_INDEX_IS_DROPPED";
    field public static final String INDEX_FROM_EMBEDDED_FIELD_IS_DROPPED = "ROOM_EMBEDDED_INDEX_IS_DROPPED";
    field public static final String INDEX_FROM_PARENT_FIELD_IS_DROPPED = "ROOM_PARENT_FIELD_INDEX_IS_DROPPED";
    field public static final String INDEX_FROM_PARENT_IS_DROPPED = "ROOM_PARENT_INDEX_IS_DROPPED";
    field public static final String MISMATCHED_GETTER = "ROOM_MISMATCHED_GETTER_TYPE";
    field public static final String MISMATCHED_SETTER = "ROOM_MISMATCHED_SETTER_TYPE";
    field public static final String MISSING_INDEX_ON_FOREIGN_KEY_CHILD = "ROOM_MISSING_FOREIGN_KEY_CHILD_INDEX";
    field public static final String MISSING_INDEX_ON_JUNCTION = "MISSING_INDEX_ON_JUNCTION";
    field public static final String MISSING_JAVA_TMP_DIR = "ROOM_MISSING_JAVA_TMP_DIR";
    field public static final String MISSING_SCHEMA_LOCATION = "ROOM_MISSING_SCHEMA_LOCATION";
    field public static final String PRIMARY_KEY_FROM_EMBEDDED_IS_DROPPED = "ROOM_EMBEDDED_PRIMARY_KEY_IS_DROPPED";
    field public static final String RELATION_QUERY_WITHOUT_TRANSACTION = "ROOM_RELATION_QUERY_WITHOUT_TRANSACTION";
    field public static final String RELATION_TYPE_MISMATCH = "ROOM_RELATION_TYPE_MISMATCH";
  }

  public static final class RoomWarnings.Companion {
  }

  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.CLASS}) public @interface SkipQueryVerification {
  }

  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.FUNCTION) public @interface Transaction {
  }

  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.FUNCTION) public @interface TypeConverter {
  }

  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.CLASS}) public @interface TypeConverters {
    method public abstract androidx.room.BuiltInTypeConverters builtInTypeConverters() default androidx.room.BuiltInTypeConverters();
    method public abstract kotlin.reflect.KClass<?>[] value();
    property public abstract androidx.room.BuiltInTypeConverters builtInTypeConverters;
    property public abstract kotlin.reflect.KClass<?>![] value;
  }

  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.FUNCTION) public @interface Update {
    method public abstract kotlin.reflect.KClass<?> entity() default java.lang.Object;
    method public abstract int onConflict() default androidx.room.OnConflictStrategy.ABORT;
    property public abstract kotlin.reflect.KClass<?> entity;
    property public abstract int onConflict;
  }

}

