// Signature format: 3.0
package androidx.ui.core {

  @androidx.compose.Immutable public final class Constraints {
    ctor public Constraints(internal long value);
    method public androidx.ui.core.Constraints copy(int minWidth = this.minWidth, int maxWidth = this.maxWidth, int minHeight = this.minHeight, int maxHeight = this.maxHeight);
    method @androidx.compose.Immutable public androidx.ui.core.Constraints copy(long value);
    method public boolean getHasBoundedHeight();
    method public boolean getHasBoundedWidth();
    method public int getMaxHeight();
    method public int getMaxWidth();
    method public int getMinHeight();
    method public int getMinWidth();
    property public final boolean hasBoundedHeight;
    property public final boolean hasBoundedWidth;
    property public final int maxHeight;
    property public final int maxWidth;
    property public final int minHeight;
    property public final int minWidth;
    field public static final androidx.ui.core.Constraints.Companion Companion;
    field public static final int Infinity = 2147483647; // 0x7fffffff
  }

  public static final class Constraints.Companion {
    method @androidx.compose.Stable public androidx.ui.core.Constraints fixed(int width, int height);
    method @androidx.compose.Stable public androidx.ui.core.Constraints fixedHeight(int height);
    method @androidx.compose.Stable public androidx.ui.core.Constraints fixedWidth(int width);
  }

  public final class ConstraintsKt {
    method @androidx.compose.Stable public static androidx.ui.core.Constraints Constraints(int minWidth = 0, int maxWidth = 2147483647, int minHeight = 0, int maxHeight = 2147483647);
    method @androidx.compose.Stable public static androidx.ui.unit.IntSize constrain(androidx.ui.core.Constraints, androidx.ui.unit.IntSize size);
    method @androidx.compose.Stable public static int constrainHeight(androidx.ui.core.Constraints, int height);
    method @androidx.compose.Stable public static int constrainWidth(androidx.ui.core.Constraints, int width);
    method @androidx.compose.Stable public static androidx.ui.core.Constraints enforce(androidx.ui.core.Constraints, androidx.ui.core.Constraints otherConstraints);
    method public static boolean getHasFixedHeight(androidx.ui.core.Constraints);
    method public static boolean getHasFixedWidth(androidx.ui.core.Constraints);
    method public static boolean isZero(androidx.ui.core.Constraints);
    method @androidx.compose.Stable public static androidx.ui.core.Constraints offset(androidx.ui.core.Constraints, int horizontal = 0, int vertical = 0);
    method @androidx.compose.Stable public static boolean satisfiedBy(androidx.ui.core.Constraints, androidx.ui.unit.IntSize size);
  }

  public enum LayoutDirection {
    method public static androidx.ui.core.LayoutDirection valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.core.LayoutDirection[] values();
    enum_constant public static final androidx.ui.core.LayoutDirection Ltr;
    enum_constant public static final androidx.ui.core.LayoutDirection Rtl;
  }

}

package androidx.ui.unit {

  public final class AndroidDensityKt {
    method public static androidx.ui.unit.Density Density(android.content.Context context);
  }

  @androidx.compose.Immutable public final class Bounds {
    method public float component1();
    method public float component2();
    method public float component3();
    method public float component4();
    method @androidx.compose.Immutable public androidx.ui.unit.Bounds copy-rIHlIKc(float left, float top, float right, float bottom);
    method public float getBottom();
    method public float getLeft();
    method public float getRight();
    method public float getTop();
  }

  @androidx.compose.Immutable public interface Density {
    method public float getDensity();
    method public float getFontScale();
    method @androidx.compose.Stable public default float toDp(int);
    method @androidx.compose.Stable public default float toDp(float);
    method @androidx.compose.Stable public default float toDp-vVlMl6k(long);
    method @androidx.compose.Stable public default int toIntPx-ipo6vVg(float);
    method @androidx.compose.Stable public default int toIntPx-vVlMl6k(long);
    method @androidx.compose.Stable public default float toPx-ipo6vVg(float);
    method @androidx.compose.Stable public default float toPx-vVlMl6k(long);
    method @androidx.compose.Stable public default androidx.ui.geometry.Rect toRect(androidx.ui.unit.Bounds);
    method @androidx.compose.Stable public default long toSp(int);
    method @androidx.compose.Stable public default long toSp(float);
    method @androidx.compose.Stable public default long toSp-ipo6vVg(float);
    property public abstract float density;
    property public abstract float fontScale;
  }

  public final class DensityKt {
    method @androidx.compose.Stable public static androidx.ui.unit.Density Density(float density, float fontScale = 1f);
  }

  @androidx.compose.Immutable public final inline class Dp implements java.lang.Comparable<androidx.ui.unit.Dp> {
    ctor public Dp();
    method @androidx.compose.Stable public operator int compareTo-ipo6vVg(float p);
    method @androidx.compose.Stable public static operator int compareTo-ipo6vVg(float $this, float other);
    method public static float constructor-impl(float value);
    method @androidx.compose.Stable public static inline operator float div-impl(float $this, float other);
    method @androidx.compose.Stable public static inline operator float div-impl(float $this, int other);
    method @androidx.compose.Stable public static inline operator float div-ipo6vVg(float $this, float other);
    method @androidx.compose.Stable public static inline operator float div-x8crYZs(float $this, float other);
    method @androidx.compose.Immutable public static inline boolean equals-impl(float p, Object? p1);
    method public static boolean equals-impl0(float p1, float p2);
    method public float getValue();
    method @androidx.compose.Immutable public static inline int hashCode-impl(float p);
    method @androidx.compose.Stable public static inline operator float minus-ipo6vVg(float $this, float other);
    method @androidx.compose.Stable public static inline operator float plus-ipo6vVg(float $this, float other);
    method @androidx.compose.Stable public static inline operator float times-impl(float $this, float other);
    method @androidx.compose.Stable public static inline operator float times-impl(float $this, int other);
    method @androidx.compose.Stable public static inline operator float times-ipo6vVg(float $this, float other);
    method @androidx.compose.Stable public static inline operator float times-x8crYZs(float $this, float other);
    method @androidx.compose.Stable public static String toString-impl(float $this);
    method @androidx.compose.Stable public static inline operator float unaryMinus-impl(float $this);
    field public static final androidx.ui.unit.Dp.Companion Companion;
  }

  public static final class Dp.Companion {
    method public float getHairline();
    method public float getInfinity();
    method public float getUnspecified();
    property public final float Hairline;
    property public final float Infinity;
    property public final float Unspecified;
  }

  @androidx.compose.Immutable public final inline class DpCubed implements java.lang.Comparable<androidx.ui.unit.DpCubed> {
    ctor public DpCubed();
    method @androidx.compose.Stable public operator int compareTo-JDqhs2g(float p);
    method @androidx.compose.Stable public static operator int compareTo-JDqhs2g(float $this, float other);
    method public static float constructor-impl(float value);
    method @androidx.compose.Stable public static inline operator float div-JDqhs2g(float $this, float other);
    method @androidx.compose.Stable public static inline operator float div-impl(float $this, float other);
    method @androidx.compose.Stable public static inline operator float div-ipo6vVg(float $this, float other);
    method @androidx.compose.Stable public static inline operator float div-x8crYZs(float $this, float other);
    method @androidx.compose.Immutable public static inline boolean equals-impl(float p, Object? p1);
    method public static boolean equals-impl0(float p1, float p2);
    method public float getValue();
    method @androidx.compose.Immutable public static inline int hashCode-impl(float p);
    method @androidx.compose.Stable public static inline operator float minus-JDqhs2g(float $this, float dimension);
    method @androidx.compose.Stable public static inline operator float plus-JDqhs2g(float $this, float dimension);
    method @androidx.compose.Stable public static inline operator float times-impl(float $this, float other);
    method @androidx.compose.Stable public static String toString-impl(float $this);
  }

  @androidx.compose.Immutable public final inline class DpInverse implements java.lang.Comparable<androidx.ui.unit.DpInverse> {
    ctor public DpInverse();
    method @androidx.compose.Stable public operator int compareTo-_K2iRR8(float p);
    method @androidx.compose.Stable public static operator int compareTo-_K2iRR8(float $this, float other);
    method public static float constructor-impl(float value);
    method @androidx.compose.Stable public static inline operator float div-impl(float $this, float other);
    method @androidx.compose.Immutable public static inline boolean equals-impl(float p, Object? p1);
    method public static boolean equals-impl0(float p1, float p2);
    method public float getValue();
    method @androidx.compose.Immutable public static inline int hashCode-impl(float p);
    method @androidx.compose.Stable public static inline operator float minus-_K2iRR8(float $this, float dimension);
    method @androidx.compose.Stable public static inline operator float plus-_K2iRR8(float $this, float dimension);
    method @androidx.compose.Stable public static inline operator float times-JDqhs2g(float $this, float other);
    method @androidx.compose.Stable public static inline operator float times-impl(float $this, float other);
    method @androidx.compose.Stable public static inline operator float times-ipo6vVg(float $this, float other);
    method @androidx.compose.Stable public static inline operator float times-x8crYZs(float $this, float other);
    method @androidx.compose.Stable public static String toString-impl(float $this);
  }

  public final class DpKt {
    method @androidx.compose.Stable public static inline long Position-98Cn76g(float x, float y);
    method @androidx.compose.Stable public static inline float coerceAtLeast-98Cn76g(float, float minimumValue);
    method @androidx.compose.Stable public static inline float coerceAtMost-98Cn76g(float, float maximumValue);
    method @androidx.compose.Stable public static inline float coerceIn-x40Cv7w(float, float minimumValue, float maximumValue);
    method @androidx.compose.Stable public static inline operator float div-H0Zl2lQ(float, float other);
    method @androidx.compose.Stable public static inline operator float div-Y_YOLaE(double, float other);
    method @androidx.compose.Stable public static inline operator float div-hZ6b2Ic(int, float other);
    method @androidx.compose.Stable public static float getDistance-T8eBu-w(long);
    method public static inline float getDp(int);
    method public static inline float getDp(double);
    method public static inline float getDp(float);
    method public static inline float getHeight(androidx.ui.unit.Bounds);
    method public static inline float getWidth(androidx.ui.unit.Bounds);
    method @androidx.compose.Stable public static inline boolean isFinite-ipo6vVg(float);
    method @androidx.compose.Stable public static float lerp-3WSoJcA(float start, float stop, float fraction);
    method @androidx.compose.Stable public static long lerp-d5NHFfI(long start, long stop, float fraction);
    method @androidx.compose.Stable public static inline float max-98Cn76g(float a, float b);
    method @androidx.compose.Stable public static inline float min-98Cn76g(float a, float b);
    method @androidx.compose.Stable public static inline operator float times-H0Zl2lQ(float, float other);
    method @androidx.compose.Stable public static inline operator float times-Y_YOLaE(double, float other);
    method @androidx.compose.Stable public static inline operator float times-hZ6b2Ic(int, float other);
  }

  @androidx.compose.Immutable public final inline class DpSquared implements java.lang.Comparable<androidx.ui.unit.DpSquared> {
    ctor public DpSquared();
    method @androidx.compose.Stable public operator int compareTo-x8crYZs(float p);
    method @androidx.compose.Stable public static operator int compareTo-x8crYZs(float $this, float other);
    method public static float constructor-impl(float value);
    method @androidx.compose.Stable public static inline operator float div-JDqhs2g(float $this, float other);
    method @androidx.compose.Stable public static inline operator float div-impl(float $this, float other);
    method @androidx.compose.Stable public static inline operator float div-ipo6vVg(float $this, float other);
    method @androidx.compose.Stable public static inline operator float div-x8crYZs(float $this, float other);
    method @androidx.compose.Immutable public static inline boolean equals-impl(float p, Object? p1);
    method public static boolean equals-impl0(float p1, float p2);
    method public float getValue();
    method @androidx.compose.Immutable public static inline int hashCode-impl(float p);
    method @androidx.compose.Stable public static inline operator float minus-x8crYZs(float $this, float other);
    method @androidx.compose.Stable public static inline operator float plus-x8crYZs(float $this, float other);
    method @androidx.compose.Stable public static inline operator float times-impl(float $this, float other);
    method @androidx.compose.Stable public static inline operator float times-ipo6vVg(float $this, float other);
    method @androidx.compose.Stable public static String toString-impl(float $this);
  }

  @androidx.compose.Immutable public final class Duration implements java.lang.Comparable<androidx.ui.unit.Duration> {
    ctor public Duration(long nanoseconds);
    method @androidx.compose.Stable public int compareTo(androidx.ui.unit.Duration other);
    method public long component1();
    method @androidx.compose.Immutable public androidx.ui.unit.Duration copy(long nanoseconds);
    method @androidx.compose.Stable public operator androidx.ui.unit.Duration div(int quotient);
    method @androidx.compose.Stable public operator androidx.ui.unit.Duration div(double quotient);
    method public long getNanoseconds();
    method @androidx.compose.Stable public operator androidx.ui.unit.Duration minus(androidx.ui.unit.Duration other);
    method @androidx.compose.Stable public operator androidx.ui.unit.Duration plus(androidx.ui.unit.Duration other);
    method @androidx.compose.Stable public operator androidx.ui.unit.Duration times(int factor);
    method @androidx.compose.Stable public operator androidx.ui.unit.Duration times(double factor);
    field public static final androidx.ui.unit.Duration.Companion Companion;
  }

  public static final class Duration.Companion {
    method public androidx.ui.unit.Duration getZero();
    property public final androidx.ui.unit.Duration Zero;
  }

  public final class Durations {
    method public static androidx.ui.unit.Duration Duration(long days = 0, long hours = 0, long minutes = 0, long seconds = 0, long milliseconds = 0, long microseconds = 0, long nanoseconds = 0);
    method public static androidx.ui.unit.Duration getDays(long);
    method public static androidx.ui.unit.Duration getDays(int);
    method public static androidx.ui.unit.Duration getHours(long);
    method public static androidx.ui.unit.Duration getHours(int);
    method public static androidx.ui.unit.Duration getMicroseconds(long);
    method public static androidx.ui.unit.Duration getMicroseconds(int);
    method public static androidx.ui.unit.Duration getMilliseconds(long);
    method public static androidx.ui.unit.Duration getMilliseconds(int);
    method public static androidx.ui.unit.Duration getMinutes(long);
    method public static androidx.ui.unit.Duration getMinutes(int);
    method public static androidx.ui.unit.Duration getNanoseconds(long);
    method public static androidx.ui.unit.Duration getNanoseconds(int);
    method public static long getNanosecondsPerDay();
    method public static long getNanosecondsPerHour();
    method public static long getNanosecondsPerMillisecond();
    method public static long getNanosecondsPerMinute();
    method public static long getNanosecondsPerSecond();
    method public static androidx.ui.unit.Duration getSeconds(long);
    method public static androidx.ui.unit.Duration getSeconds(int);
    method public static long inDays(androidx.ui.unit.Duration);
    method public static long inHours(androidx.ui.unit.Duration);
    method public static long inMicroseconds(androidx.ui.unit.Duration);
    method public static long inMilliseconds(androidx.ui.unit.Duration);
    method public static long inMinutes(androidx.ui.unit.Duration);
    method public static long inSeconds(androidx.ui.unit.Duration);
    field public static final long HoursPerDay = 24L; // 0x18L
    field public static final long MicrosecondsPerMillisecond = 1000L; // 0x3e8L
    field public static final long MillisecondsPerSecond = 1000L; // 0x3e8L
    field public static final long MinutesPerHour = 60L; // 0x3cL
    field public static final long NanosecondsPerMicrosecond = 1000L; // 0x3e8L
    field public static final long SecondsPerMinute = 60L; // 0x3cL
  }

  @androidx.compose.Immutable public final class IntBounds {
    ctor public IntBounds(int left, int top, int right, int bottom);
    method public int component1();
    method public int component2();
    method public int component3();
    method public int component4();
    method @androidx.compose.Immutable public androidx.ui.unit.IntBounds copy(int left, int top, int right, int bottom);
    method public int getBottom();
    method public int getLeft();
    method public int getRight();
    method public int getTop();
  }

  public final class IntBoundsKt {
    method @androidx.compose.Stable public static inline androidx.ui.unit.IntBounds IntBounds(androidx.ui.unit.IntOffset topLeft, androidx.ui.unit.IntSize size);
    method @androidx.compose.Stable public static inline androidx.ui.unit.IntOffset center(androidx.ui.unit.IntBounds);
    method public static inline int getHeight(androidx.ui.unit.IntBounds);
    method public static inline int getWidth(androidx.ui.unit.IntBounds);
    method @androidx.compose.Stable public static androidx.ui.unit.IntBounds toBounds(androidx.ui.unit.IntSize);
    method @androidx.compose.Stable public static androidx.ui.geometry.Rect toRect(androidx.ui.unit.IntBounds);
    method @androidx.compose.Stable public static androidx.ui.unit.IntSize toSize(androidx.ui.unit.IntBounds);
  }

  @androidx.compose.Immutable public final class IntOffset {
    ctor public IntOffset(internal long value);
    method @androidx.compose.Stable public inline operator int component1();
    method @androidx.compose.Stable public inline operator int component2();
    method public int getX();
    method public int getY();
    method @androidx.compose.Stable public inline operator androidx.ui.unit.IntOffset minus(androidx.ui.unit.IntOffset other);
    method @androidx.compose.Stable public inline operator androidx.ui.unit.IntOffset plus(androidx.ui.unit.IntOffset other);
    method @androidx.compose.Stable public inline operator androidx.ui.unit.IntOffset unaryMinus();
    property public final int x;
    property public final int y;
    field public static final androidx.ui.unit.IntOffset.Companion Companion;
  }

  public static final class IntOffset.Companion {
    method public androidx.ui.unit.IntOffset getOrigin();
    property public final androidx.ui.unit.IntOffset Origin;
  }

  public final class IntOffsetKt {
    method @androidx.compose.Stable public static inline androidx.ui.unit.IntOffset IntOffset(int x, int y);
    method @androidx.compose.Stable public static androidx.ui.unit.IntOffset lerp(androidx.ui.unit.IntOffset start, androidx.ui.unit.IntOffset stop, float fraction);
    method @androidx.compose.Stable public static operator androidx.ui.geometry.Offset minus(androidx.ui.geometry.Offset, androidx.ui.unit.IntOffset offset);
    method @androidx.compose.Stable public static operator androidx.ui.geometry.Offset minus(androidx.ui.unit.IntOffset, androidx.ui.geometry.Offset offset);
    method @androidx.compose.Stable public static operator androidx.ui.geometry.Offset plus(androidx.ui.geometry.Offset, androidx.ui.unit.IntOffset offset);
    method @androidx.compose.Stable public static operator androidx.ui.geometry.Offset plus(androidx.ui.unit.IntOffset, androidx.ui.geometry.Offset offset);
    method @androidx.compose.Stable public static inline androidx.ui.geometry.Offset toOffset(androidx.ui.unit.IntOffset);
  }

  @androidx.compose.Immutable public final class IntSize {
    ctor public IntSize(internal long packedValue);
    method @androidx.compose.Stable public inline operator int component1();
    method @androidx.compose.Stable public inline operator int component2();
    method @androidx.compose.Stable public operator androidx.ui.unit.IntSize div(int other);
    method public int getHeight();
    method public int getWidth();
    method @androidx.compose.Stable public operator androidx.ui.unit.IntSize times(int other);
    property public final int height;
    property public final int width;
    field public static final androidx.ui.unit.IntSize.Companion Companion;
  }

  public static final class IntSize.Companion {
    method public androidx.ui.unit.IntSize getZero();
    property public final androidx.ui.unit.IntSize Zero;
  }

  public final class IntSizeKt {
    method @androidx.compose.Stable public static androidx.ui.unit.IntSize IntSize(int width, int height);
    method public static androidx.ui.unit.IntOffset getCenter(androidx.ui.unit.IntSize);
    method @androidx.compose.Stable public static operator androidx.ui.unit.IntSize times(int, androidx.ui.unit.IntSize size);
    method @androidx.compose.Stable public static long toSize(androidx.ui.unit.IntSize);
  }

  @androidx.compose.Immutable public final inline class Position {
    ctor public Position();
    method public static long constructor-impl(internal long packedValue);
    method public static long copy-98Cn76g(long $this, float x = this.x, float y = this.y);
    method @androidx.compose.Immutable public static inline boolean equals-impl(long p, Object? p1);
    method public static boolean equals-impl0(long p1, long p2);
    method public static float getX-impl(long $this);
    method public static float getY-impl(long $this);
    method @androidx.compose.Immutable public static inline int hashCode-impl(long p);
    method @androidx.compose.Stable public static inline operator long minus-T8eBu-w(long $this, long other);
    method @androidx.compose.Stable public static inline operator long plus-T8eBu-w(long $this, long other);
    method @androidx.compose.Stable public static String toString-impl(long $this);
  }

  @androidx.compose.Immutable public final class PxBounds {
    ctor public PxBounds(float left, float top, float right, float bottom);
    method public float component1();
    method public float component2();
    method public float component3();
    method public float component4();
    method @androidx.compose.Immutable public androidx.ui.unit.PxBounds copy(float left, float top, float right, float bottom);
    method public float getBottom();
    method public float getLeft();
    method public float getRight();
    method public float getTop();
  }

  @androidx.compose.Immutable public final inline class PxCubed implements java.lang.Comparable<androidx.ui.unit.PxCubed> {
    ctor public PxCubed();
    method @androidx.compose.Stable public operator int compareTo-bji3ab4(float p);
    method @androidx.compose.Stable public static operator int compareTo-bji3ab4(float $this, float other);
    method public static float constructor-impl(float value);
    method @androidx.compose.Stable public static inline operator float div-bji3ab4(float $this, float other);
    method @androidx.compose.Stable public static inline operator float div-impl(float $this, float other);
    method @androidx.compose.Immutable public static inline boolean equals-impl(float p, Object? p1);
    method public static boolean equals-impl0(float p1, float p2);
    method public float getValue();
    method @androidx.compose.Immutable public static inline int hashCode-impl(float p);
    method @androidx.compose.Stable public static inline operator float minus-bji3ab4(float $this, float dimension);
    method @androidx.compose.Stable public static inline operator float plus-bji3ab4(float $this, float dimension);
    method @androidx.compose.Stable public static inline operator float times-impl(float $this, float other);
    method @androidx.compose.Stable public static String toString-impl(float $this);
  }

  @androidx.compose.Immutable public final inline class PxInverse implements java.lang.Comparable<androidx.ui.unit.PxInverse> {
    ctor public PxInverse();
    method @androidx.compose.Stable public operator int compareTo-KGV0gLo(float p);
    method @androidx.compose.Stable public static operator int compareTo-KGV0gLo(float $this, float other);
    method public static float constructor-impl(float value);
    method @androidx.compose.Stable public static inline operator float div-impl(float $this, float other);
    method @androidx.compose.Immutable public static inline boolean equals-impl(float p, Object? p1);
    method public static boolean equals-impl0(float p1, float p2);
    method public float getValue();
    method @androidx.compose.Immutable public static inline int hashCode-impl(float p);
    method @androidx.compose.Stable public static inline operator float minus-KGV0gLo(float $this, float dimension);
    method @androidx.compose.Stable public static inline operator float plus-KGV0gLo(float $this, float dimension);
    method @androidx.compose.Stable public static inline operator float times-bji3ab4(float $this, float other);
    method @androidx.compose.Stable public static inline operator float times-impl(float $this, float other);
    method @androidx.compose.Stable public static String toString-impl(float $this);
  }

  public final class PxKt {
    method @androidx.compose.Stable public static inline androidx.ui.unit.PxBounds PxBounds-oHQNTA4(androidx.ui.geometry.Offset topLeft, long size);
    method @androidx.compose.Stable public static inline androidx.ui.geometry.Offset center(androidx.ui.unit.PxBounds);
    method @androidx.compose.Stable public static androidx.ui.geometry.Offset center-b2zCL34(long);
    method public static inline float getHeight(androidx.ui.unit.PxBounds);
    method public static inline float getWidth(androidx.ui.unit.PxBounds);
    method @androidx.compose.Stable public static inline androidx.ui.unit.IntOffset round(androidx.ui.geometry.Offset);
    method @androidx.compose.Stable public static androidx.ui.unit.PxBounds toBounds-b2zCL34(long);
    method @androidx.compose.Stable public static androidx.ui.geometry.Rect toRect(androidx.ui.unit.PxBounds);
    method @androidx.compose.Stable public static long toSize(androidx.ui.unit.PxBounds);
  }

  @androidx.compose.Immutable public final inline class PxSquared implements java.lang.Comparable<androidx.ui.unit.PxSquared> {
    ctor public PxSquared();
    method @androidx.compose.Stable public operator int compareTo-RjPF0Mw(float p);
    method @androidx.compose.Stable public static operator int compareTo-RjPF0Mw(float $this, float other);
    method public static float constructor-impl(float value);
    method @androidx.compose.Stable public static inline operator float div-RjPF0Mw(float $this, float other);
    method @androidx.compose.Stable public static inline operator float div-bji3ab4(float $this, float other);
    method @androidx.compose.Stable public static inline operator float div-impl(float $this, float other);
    method @androidx.compose.Immutable public static inline boolean equals-impl(float p, Object? p1);
    method public static boolean equals-impl0(float p1, float p2);
    method public float getValue();
    method @androidx.compose.Immutable public static inline int hashCode-impl(float p);
    method @androidx.compose.Stable public static inline operator float minus-RjPF0Mw(float $this, float other);
    method @androidx.compose.Stable public static inline operator float plus-RjPF0Mw(float $this, float other);
    method @androidx.compose.Stable public static inline operator float times-impl(float $this, float other);
    method @androidx.compose.Stable public static String toString-impl(float $this);
  }

  @androidx.compose.Immutable public final inline class TextUnit {
    ctor public TextUnit();
    method public static inline operator int compareTo-vVlMl6k(long $this, long other);
    method public static long constructor-impl(long packedValue);
    method public static inline operator long div-impl(long $this, float other);
    method public static inline operator long div-impl(long $this, double other);
    method public static inline operator long div-impl(long $this, int other);
    method public static inline operator float div-vVlMl6k(long $this, long other);
    method @androidx.compose.Immutable public static inline boolean equals-impl(long p, Object? p1);
    method public static boolean equals-impl0(long p1, long p2);
    method public long getPackedValue();
    method public static androidx.ui.unit.TextUnitType getType-impl(long $this);
    method public static float getValue-impl(long $this);
    method @androidx.compose.Immutable public static inline int hashCode-impl(long p);
    method public static boolean isEm-impl(long $this);
    method public static boolean isInherit-impl(long $this);
    method public static boolean isSp-impl(long $this);
    method public static inline operator long minus-vVlMl6k(long $this, long other);
    method public static inline operator long plus-vVlMl6k(long $this, long other);
    method public static inline operator long times-impl(long $this, float other);
    method public static inline operator long times-impl(long $this, double other);
    method public static inline operator long times-impl(long $this, int other);
    method public static String toString-impl(long $this);
    method public static inline operator long unaryMinus-impl(long $this);
    field public static final androidx.ui.unit.TextUnit.Companion Companion;
  }

  public static final class TextUnit.Companion {
    method public long Em(int value);
    method public long Em(float value);
    method public long Em(double value);
    method public long Sp(int value);
    method public long Sp(float value);
    method public long Sp(double value);
    method public long getInherit();
    property public final long Inherit;
  }

  public final class TextUnitKt {
    method @androidx.compose.Stable public static inline long coerceAtLeast-gL_aCS0(long, long minimumValue);
    method @androidx.compose.Stable public static inline long coerceAtMost-gL_aCS0(long, long maximumValue);
    method @androidx.compose.Stable public static inline long coerceIn-Y2exRck(long, long minimumValue, long maximumValue);
    method public static long getEm(float);
    method public static long getEm(double);
    method public static long getEm(int);
    method public static long getSp(float);
    method public static long getSp(double);
    method public static long getSp(int);
    method @androidx.compose.Stable public static long lerp-SpZbbpo(long a, long b, float t);
    method @androidx.compose.Stable public static inline long max-gL_aCS0(long a, long b);
    method @androidx.compose.Stable public static inline long min-gL_aCS0(long a, long b);
    method @androidx.compose.Stable public static inline operator long times-GncdoDw(double, long other);
    method @androidx.compose.Stable public static inline operator long times-MVx5XBU(float, long other);
    method @androidx.compose.Stable public static inline operator long times-UlzjdM0(int, long other);
  }

  public enum TextUnitType {
    method public static androidx.ui.unit.TextUnitType valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.unit.TextUnitType[] values();
    enum_constant public static final androidx.ui.unit.TextUnitType Em;
    enum_constant public static final androidx.ui.unit.TextUnitType Inherit;
    enum_constant public static final androidx.ui.unit.TextUnitType Sp;
  }

  @androidx.compose.Immutable public final class Uptime implements java.lang.Comparable<androidx.ui.unit.Uptime> {
    ctor public Uptime(long nanoseconds);
    method public int compareTo(androidx.ui.unit.Uptime other);
    method public long component1();
    method @androidx.compose.Immutable public androidx.ui.unit.Uptime copy(long nanoseconds);
    method public long getNanoseconds();
    method public operator androidx.ui.unit.Uptime minus(androidx.ui.unit.Duration duration);
    method public operator androidx.ui.unit.Duration minus(androidx.ui.unit.Uptime other);
    method public operator androidx.ui.unit.Uptime plus(androidx.ui.unit.Duration duration);
    field public static final androidx.ui.unit.Uptime.Companion Companion;
  }

  public static final class Uptime.Companion {
    method public androidx.ui.unit.Uptime getBoot();
    property public final androidx.ui.unit.Uptime Boot;
  }

  public final class UptimeKt {
    method public static operator androidx.ui.unit.Uptime plus(androidx.ui.unit.Duration, androidx.ui.unit.Uptime uptime);
  }

  @androidx.compose.Immutable public final class Velocity {
    ctor public Velocity(androidx.ui.geometry.Offset pixelsPerSecond);
    method public androidx.ui.geometry.Offset component1();
    method @androidx.compose.Immutable public androidx.ui.unit.Velocity copy(androidx.ui.geometry.Offset pixelsPerSecond);
    method public androidx.ui.geometry.Offset getPixelsPerSecond();
    method public operator androidx.ui.unit.Velocity unaryMinus();
    field public static final androidx.ui.unit.Velocity.Companion Companion;
  }

  public static final class Velocity.Companion {
    method public androidx.ui.unit.Velocity getZero();
    property public final androidx.ui.unit.Velocity Zero;
  }

  public final class VelocityKt {
    method public static operator androidx.ui.unit.Velocity minus(androidx.ui.unit.Velocity, androidx.ui.unit.Velocity other);
    method public static operator androidx.ui.unit.Velocity plus(androidx.ui.unit.Velocity, androidx.ui.unit.Velocity other);
  }

}

