// Signature format: 4.0
package androidx.compose.ui {

  public final class AbsoluteAlignment {
    method public androidx.compose.ui.Alignment getBottomLeft();
    method public androidx.compose.ui.Alignment getBottomRight();
    method public androidx.compose.ui.Alignment getCenterLeft();
    method public androidx.compose.ui.Alignment getCenterRight();
    method public androidx.compose.ui.Alignment.Horizontal getLeft();
    method public androidx.compose.ui.Alignment.Horizontal getRight();
    method public androidx.compose.ui.Alignment getTopLeft();
    method public androidx.compose.ui.Alignment getTopRight();
    property public final androidx.compose.ui.Alignment BottomLeft;
    property public final androidx.compose.ui.Alignment BottomRight;
    property public final androidx.compose.ui.Alignment CenterLeft;
    property public final androidx.compose.ui.Alignment CenterRight;
    property public final androidx.compose.ui.Alignment.Horizontal Left;
    property public final androidx.compose.ui.Alignment.Horizontal Right;
    property public final androidx.compose.ui.Alignment TopLeft;
    property public final androidx.compose.ui.Alignment TopRight;
    field public static final androidx.compose.ui.AbsoluteAlignment INSTANCE;
  }

  public final class ActualKt {
  }

  @androidx.compose.runtime.Stable public fun interface Alignment {
    method public long align(long size, long space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
    field public static final androidx.compose.ui.Alignment.Companion Companion;
  }

  public static final class Alignment.Companion {
    method public androidx.compose.ui.Alignment.Vertical getBottom();
    method public androidx.compose.ui.Alignment getBottomCenter();
    method public androidx.compose.ui.Alignment getBottomEnd();
    method public androidx.compose.ui.Alignment getBottomStart();
    method public androidx.compose.ui.Alignment getCenter();
    method public androidx.compose.ui.Alignment getCenterEnd();
    method public androidx.compose.ui.Alignment.Horizontal getCenterHorizontally();
    method public androidx.compose.ui.Alignment getCenterStart();
    method public androidx.compose.ui.Alignment.Vertical getCenterVertically();
    method public androidx.compose.ui.Alignment.Horizontal getEnd();
    method public androidx.compose.ui.Alignment.Horizontal getStart();
    method public androidx.compose.ui.Alignment.Vertical getTop();
    method public androidx.compose.ui.Alignment getTopCenter();
    method public androidx.compose.ui.Alignment getTopEnd();
    method public androidx.compose.ui.Alignment getTopStart();
    property public final androidx.compose.ui.Alignment.Vertical Bottom;
    property public final androidx.compose.ui.Alignment BottomCenter;
    property public final androidx.compose.ui.Alignment BottomEnd;
    property public final androidx.compose.ui.Alignment BottomStart;
    property public final androidx.compose.ui.Alignment Center;
    property public final androidx.compose.ui.Alignment CenterEnd;
    property public final androidx.compose.ui.Alignment.Horizontal CenterHorizontally;
    property public final androidx.compose.ui.Alignment CenterStart;
    property public final androidx.compose.ui.Alignment.Vertical CenterVertically;
    property public final androidx.compose.ui.Alignment.Horizontal End;
    property public final androidx.compose.ui.Alignment.Horizontal Start;
    property public final androidx.compose.ui.Alignment.Vertical Top;
    property public final androidx.compose.ui.Alignment TopCenter;
    property public final androidx.compose.ui.Alignment TopEnd;
    property public final androidx.compose.ui.Alignment TopStart;
  }

  @androidx.compose.runtime.Stable public static fun interface Alignment.Horizontal {
    method public int align(int size, int space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
  }

  @androidx.compose.runtime.Stable public static fun interface Alignment.Vertical {
    method public int align(int size, int space);
  }

  @androidx.compose.runtime.Immutable public final class BiasAbsoluteAlignment implements androidx.compose.ui.Alignment {
    ctor public BiasAbsoluteAlignment(float horizontalBias, float verticalBias);
    method public long align(long size, long space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
    method public androidx.compose.ui.BiasAbsoluteAlignment copy(float horizontalBias, float verticalBias);
  }

  @androidx.compose.runtime.Immutable public static final class BiasAbsoluteAlignment.Horizontal implements androidx.compose.ui.Alignment.Horizontal {
    ctor public BiasAbsoluteAlignment.Horizontal(float bias);
    method public int align(int size, int space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
    method public androidx.compose.ui.BiasAbsoluteAlignment.Horizontal copy(float bias);
  }

  @androidx.compose.runtime.Immutable public final class BiasAlignment implements androidx.compose.ui.Alignment {
    ctor public BiasAlignment(float horizontalBias, float verticalBias);
    method public long align(long size, long space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
    method public float component1();
    method public float component2();
    method public androidx.compose.ui.BiasAlignment copy(float horizontalBias, float verticalBias);
    method public float getHorizontalBias();
    method public float getVerticalBias();
    property public final float horizontalBias;
    property public final float verticalBias;
  }

  @androidx.compose.runtime.Immutable public static final class BiasAlignment.Horizontal implements androidx.compose.ui.Alignment.Horizontal {
    ctor public BiasAlignment.Horizontal(float bias);
    method public int align(int size, int space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
    method public androidx.compose.ui.BiasAlignment.Horizontal copy(float bias);
  }

  @androidx.compose.runtime.Immutable public static final class BiasAlignment.Vertical implements androidx.compose.ui.Alignment.Vertical {
    ctor public BiasAlignment.Vertical(float bias);
    method public int align(int size, int space);
    method public androidx.compose.ui.BiasAlignment.Vertical copy(float bias);
  }

  public final class CombinedModifier implements androidx.compose.ui.Modifier {
    ctor public CombinedModifier(androidx.compose.ui.Modifier outer, androidx.compose.ui.Modifier inner);
    method public boolean all(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
    method public boolean any(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
    method public <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.compose.ui.Modifier.Element,? extends R> operation);
    method public <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.compose.ui.Modifier.Element,? super R,? extends R> operation);
  }

  public final class ComposedModifierKt {
    method public static androidx.compose.ui.Modifier composed(androidx.compose.ui.Modifier, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> inspectorInfo, kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier,? extends androidx.compose.ui.Modifier> factory);
    method public static androidx.compose.ui.Modifier materialize(androidx.compose.runtime.Composer, androidx.compose.ui.Modifier modifier);
  }

  @androidx.compose.runtime.Stable @kotlin.jvm.JvmDefaultWithCompatibility public interface Modifier {
    method public boolean all(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
    method public boolean any(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
    method public <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.compose.ui.Modifier.Element,? extends R> operation);
    method public <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.compose.ui.Modifier.Element,? super R,? extends R> operation);
    method public default infix androidx.compose.ui.Modifier then(androidx.compose.ui.Modifier other);
    field public static final androidx.compose.ui.Modifier.Companion Companion;
  }

  public static final class Modifier.Companion implements androidx.compose.ui.Modifier {
    method public boolean all(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
    method public boolean any(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
    method public <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.compose.ui.Modifier.Element,? extends R> operation);
    method public <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.compose.ui.Modifier.Element,? super R,? extends R> operation);
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public static interface Modifier.Element extends androidx.compose.ui.Modifier {
    method public default boolean all(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
    method public default boolean any(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
    method public default <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.compose.ui.Modifier.Element,? extends R> operation);
    method public default <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.compose.ui.Modifier.Element,? super R,? extends R> operation);
  }

  @androidx.compose.runtime.Stable public interface MotionDurationScale extends kotlin.coroutines.CoroutineContext.Element {
    method public default kotlin.coroutines.CoroutineContext.Key<?> getKey();
    method public float getScaleFactor();
    property public default kotlin.coroutines.CoroutineContext.Key<?> key;
    property public abstract float scaleFactor;
    field public static final androidx.compose.ui.MotionDurationScale.Key Key;
  }

  public static final class MotionDurationScale.Key implements kotlin.coroutines.CoroutineContext.Key<androidx.compose.ui.MotionDurationScale> {
  }

  public final class TempListUtilsKt {
  }

  @androidx.compose.runtime.ComposableTargetMarker(description="UI Composable") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FILE, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.TYPE, kotlin.annotation.AnnotationTarget.TYPE_PARAMETER}) public @interface UiComposable {
  }

  public final class ZIndexModifierKt {
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier zIndex(androidx.compose.ui.Modifier, float zIndex);
  }

}

package androidx.compose.ui.autofill {

  public final class AndroidAutofillType_androidKt {
  }

  public final class AndroidAutofill_androidKt {
  }

}

package androidx.compose.ui.draw {

  public final class AlphaKt {
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier alpha(androidx.compose.ui.Modifier, float alpha);
  }

  public final class BlurKt {
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier blur(androidx.compose.ui.Modifier, float radiusX, float radiusY, optional androidx.compose.ui.graphics.Shape edgeTreatment);
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier blur(androidx.compose.ui.Modifier, float radius, optional androidx.compose.ui.graphics.Shape edgeTreatment);
  }

  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class BlurredEdgeTreatment {
    ctor public BlurredEdgeTreatment(androidx.compose.ui.graphics.Shape? shape);
    method public androidx.compose.ui.graphics.Shape? getShape();
    property public final androidx.compose.ui.graphics.Shape? shape;
    field public static final androidx.compose.ui.draw.BlurredEdgeTreatment.Companion Companion;
  }

  public static final class BlurredEdgeTreatment.Companion {
    method public androidx.compose.ui.graphics.Shape getRectangle();
    method public androidx.compose.ui.graphics.Shape getUnbounded();
    property public final androidx.compose.ui.graphics.Shape Rectangle;
    property public final androidx.compose.ui.graphics.Shape Unbounded;
  }

  public interface BuildDrawCacheParams {
    method public androidx.compose.ui.unit.Density getDensity();
    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
    method public long getSize();
    property public abstract androidx.compose.ui.unit.Density density;
    property public abstract androidx.compose.ui.unit.LayoutDirection layoutDirection;
    property public abstract long size;
  }

  public final class CacheDrawScope implements androidx.compose.ui.unit.Density {
    method public float getDensity();
    method public float getFontScale();
    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
    method public long getSize();
    method public androidx.compose.ui.draw.DrawResult onDrawBehind(kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
    method public androidx.compose.ui.draw.DrawResult onDrawWithContent(kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.ContentDrawScope,kotlin.Unit> block);
    property public float density;
    property public float fontScale;
    property public final androidx.compose.ui.unit.LayoutDirection layoutDirection;
    property public final long size;
  }

  public final class ClipKt {
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier clip(androidx.compose.ui.Modifier, androidx.compose.ui.graphics.Shape shape);
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier clipToBounds(androidx.compose.ui.Modifier);
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface DrawCacheModifier extends androidx.compose.ui.draw.DrawModifier {
    method public void onBuildCache(androidx.compose.ui.draw.BuildDrawCacheParams params);
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface DrawModifier extends androidx.compose.ui.Modifier.Element {
    method public void draw(androidx.compose.ui.graphics.drawscope.ContentDrawScope);
  }

  public final class DrawModifierKt {
    method public static androidx.compose.ui.Modifier drawBehind(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> onDraw);
    method public static androidx.compose.ui.Modifier drawWithCache(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.draw.CacheDrawScope,androidx.compose.ui.draw.DrawResult> onBuildDrawCache);
    method public static androidx.compose.ui.Modifier drawWithContent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.ContentDrawScope,kotlin.Unit> onDraw);
  }

  public final class DrawResult {
  }

  public final class PainterModifierKt {
    method public static androidx.compose.ui.Modifier paint(androidx.compose.ui.Modifier, androidx.compose.ui.graphics.painter.Painter painter, optional boolean sizeToIntrinsics, optional androidx.compose.ui.Alignment alignment, optional androidx.compose.ui.layout.ContentScale contentScale, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
  }

  public final class RotateKt {
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier rotate(androidx.compose.ui.Modifier, float degrees);
  }

  public final class ScaleKt {
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier scale(androidx.compose.ui.Modifier, float scaleX, float scaleY);
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier scale(androidx.compose.ui.Modifier, float scale);
  }

  public final class ShadowKt {
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier shadow(androidx.compose.ui.Modifier, float elevation, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip, optional long ambientColor, optional long spotColor);
    method @Deprecated @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier! shadow(androidx.compose.ui.Modifier, float elevation, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip);
  }

}

package androidx.compose.ui.focus {

  public final class BeyondBoundsLayoutKt {
  }

  public final class FocusChangedModifierKt {
    method public static androidx.compose.ui.Modifier onFocusChanged(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.focus.FocusState,kotlin.Unit> onFocusChanged);
  }

  @kotlin.jvm.JvmInline public final value class FocusDirection {
    field public static final androidx.compose.ui.focus.FocusDirection.Companion Companion;
  }

  public static final class FocusDirection.Companion {
    method public int getDown();
    method public int getLeft();
    method public int getNext();
    method public int getPrevious();
    method public int getRight();
    method public int getUp();
    property public final int Down;
    property public final int Left;
    property public final int Next;
    property public final int Previous;
    property public final int Right;
    property public final int Up;
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface FocusEventModifier extends androidx.compose.ui.Modifier.Element {
    method public void onFocusEvent(androidx.compose.ui.focus.FocusState focusState);
  }

  public final class FocusEventModifierKt {
    method public static androidx.compose.ui.Modifier onFocusEvent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.focus.FocusState,kotlin.Unit> onFocusEvent);
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface FocusManager {
    method public void clearFocus(optional boolean force);
    method public boolean moveFocus(int focusDirection);
  }

  public final class FocusManagerKt {
  }

  public final class FocusModifierKt {
    method @Deprecated public static androidx.compose.ui.Modifier focusModifier(androidx.compose.ui.Modifier);
    method public static androidx.compose.ui.Modifier focusTarget(androidx.compose.ui.Modifier);
  }

  @Deprecated public final class FocusOrder {
    ctor @Deprecated public FocusOrder();
    method @Deprecated public androidx.compose.ui.focus.FocusRequester getDown();
    method @Deprecated public androidx.compose.ui.focus.FocusRequester getEnd();
    method @Deprecated public androidx.compose.ui.focus.FocusRequester getLeft();
    method @Deprecated public androidx.compose.ui.focus.FocusRequester getNext();
    method @Deprecated public androidx.compose.ui.focus.FocusRequester getPrevious();
    method @Deprecated public androidx.compose.ui.focus.FocusRequester getRight();
    method @Deprecated public androidx.compose.ui.focus.FocusRequester getStart();
    method @Deprecated public androidx.compose.ui.focus.FocusRequester getUp();
    method @Deprecated public void setDown(androidx.compose.ui.focus.FocusRequester);
    method @Deprecated public void setEnd(androidx.compose.ui.focus.FocusRequester);
    method @Deprecated public void setLeft(androidx.compose.ui.focus.FocusRequester);
    method @Deprecated public void setNext(androidx.compose.ui.focus.FocusRequester);
    method @Deprecated public void setPrevious(androidx.compose.ui.focus.FocusRequester);
    method @Deprecated public void setRight(androidx.compose.ui.focus.FocusRequester);
    method @Deprecated public void setStart(androidx.compose.ui.focus.FocusRequester);
    method @Deprecated public void setUp(androidx.compose.ui.focus.FocusRequester);
    property public final androidx.compose.ui.focus.FocusRequester down;
    property public final androidx.compose.ui.focus.FocusRequester end;
    property public final androidx.compose.ui.focus.FocusRequester left;
    property public final androidx.compose.ui.focus.FocusRequester next;
    property public final androidx.compose.ui.focus.FocusRequester previous;
    property public final androidx.compose.ui.focus.FocusRequester right;
    property public final androidx.compose.ui.focus.FocusRequester start;
    property public final androidx.compose.ui.focus.FocusRequester up;
  }

  @Deprecated @kotlin.jvm.JvmDefaultWithCompatibility public interface FocusOrderModifier extends androidx.compose.ui.Modifier.Element {
    method @Deprecated public void populateFocusOrder(androidx.compose.ui.focus.FocusOrder focusOrder);
  }

  public final class FocusOrderModifierKt {
    method @Deprecated public static androidx.compose.ui.Modifier focusOrder(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.focus.FocusOrder,kotlin.Unit> focusOrderReceiver);
    method @Deprecated public static androidx.compose.ui.Modifier focusOrder(androidx.compose.ui.Modifier, androidx.compose.ui.focus.FocusRequester focusRequester);
    method @Deprecated public static androidx.compose.ui.Modifier focusOrder(androidx.compose.ui.Modifier, androidx.compose.ui.focus.FocusRequester focusRequester, kotlin.jvm.functions.Function1<? super androidx.compose.ui.focus.FocusOrder,kotlin.Unit> focusOrderReceiver);
  }

  public interface FocusProperties {
    method public boolean getCanFocus();
    method public default androidx.compose.ui.focus.FocusRequester getDown();
    method public default androidx.compose.ui.focus.FocusRequester getEnd();
    method public default androidx.compose.ui.focus.FocusRequester getLeft();
    method public default androidx.compose.ui.focus.FocusRequester getNext();
    method public default androidx.compose.ui.focus.FocusRequester getPrevious();
    method public default androidx.compose.ui.focus.FocusRequester getRight();
    method public default androidx.compose.ui.focus.FocusRequester getStart();
    method public default androidx.compose.ui.focus.FocusRequester getUp();
    method public void setCanFocus(boolean);
    method public default void setDown(androidx.compose.ui.focus.FocusRequester);
    method public default void setEnd(androidx.compose.ui.focus.FocusRequester);
    method public default void setLeft(androidx.compose.ui.focus.FocusRequester);
    method public default void setNext(androidx.compose.ui.focus.FocusRequester);
    method public default void setPrevious(androidx.compose.ui.focus.FocusRequester);
    method public default void setRight(androidx.compose.ui.focus.FocusRequester);
    method public default void setStart(androidx.compose.ui.focus.FocusRequester);
    method public default void setUp(androidx.compose.ui.focus.FocusRequester);
    property public abstract boolean canFocus;
    property public default androidx.compose.ui.focus.FocusRequester down;
    property public default androidx.compose.ui.focus.FocusRequester end;
    property public default androidx.compose.ui.focus.FocusRequester left;
    property public default androidx.compose.ui.focus.FocusRequester next;
    property public default androidx.compose.ui.focus.FocusRequester previous;
    property public default androidx.compose.ui.focus.FocusRequester right;
    property public default androidx.compose.ui.focus.FocusRequester start;
    property public default androidx.compose.ui.focus.FocusRequester up;
  }

  public final class FocusPropertiesKt {
    method public static androidx.compose.ui.Modifier focusProperties(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.focus.FocusProperties,kotlin.Unit> scope);
  }

  public final class FocusRequester {
    ctor public FocusRequester();
    method public boolean captureFocus();
    method public boolean freeFocus();
    method public void requestFocus();
    field public static final androidx.compose.ui.focus.FocusRequester.Companion Companion;
  }

  public static final class FocusRequester.Companion {
    method public androidx.compose.ui.focus.FocusRequester getDefault();
    property public final androidx.compose.ui.focus.FocusRequester Default;
  }

  public final class FocusRequesterKt {
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface FocusRequesterModifier extends androidx.compose.ui.Modifier.Element {
    method public androidx.compose.ui.focus.FocusRequester getFocusRequester();
    property public abstract androidx.compose.ui.focus.FocusRequester focusRequester;
  }

  public final class FocusRequesterModifierKt {
    method public static androidx.compose.ui.Modifier focusRequester(androidx.compose.ui.Modifier, androidx.compose.ui.focus.FocusRequester focusRequester);
  }

  public interface FocusState {
    method public boolean getHasFocus();
    method public boolean isCaptured();
    method public boolean isFocused();
    property public abstract boolean hasFocus;
    property public abstract boolean isCaptured;
    property public abstract boolean isFocused;
  }

  public final class FocusTransactionsKt {
  }

  public final class FocusTraversalKt {
  }

  public final class OneDimensionalFocusSearchKt {
  }

  public final class TwoDimensionalFocusSearchKt {
  }

}

package androidx.compose.ui.graphics {

  public final class GraphicsLayerModifierKt {
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier graphicsLayer(androidx.compose.ui.Modifier, optional float scaleX, optional float scaleY, optional float alpha, optional float translationX, optional float translationY, optional float shadowElevation, optional float rotationX, optional float rotationY, optional float rotationZ, optional float cameraDistance, optional long transformOrigin, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip, optional androidx.compose.ui.graphics.RenderEffect? renderEffect, optional long ambientShadowColor, optional long spotShadowColor);
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier graphicsLayer(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> block);
    method @Deprecated @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier! graphicsLayer(androidx.compose.ui.Modifier, optional float scaleX, optional float scaleY, optional float alpha, optional float translationX, optional float translationY, optional float shadowElevation, optional float rotationX, optional float rotationY, optional float rotationZ, optional float cameraDistance, optional long transformOrigin, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip);
    method @Deprecated @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier! graphicsLayer(androidx.compose.ui.Modifier, optional float scaleX, optional float scaleY, optional float alpha, optional float translationX, optional float translationY, optional float shadowElevation, optional float rotationX, optional float rotationY, optional float rotationZ, optional float cameraDistance, optional long transformOrigin, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip, optional androidx.compose.ui.graphics.RenderEffect? renderEffect);
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier toolingGraphicsLayer(androidx.compose.ui.Modifier);
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface GraphicsLayerScope extends androidx.compose.ui.unit.Density {
    method public float getAlpha();
    method public default long getAmbientShadowColor();
    method public float getCameraDistance();
    method public boolean getClip();
    method public default androidx.compose.ui.graphics.RenderEffect? getRenderEffect();
    method public float getRotationX();
    method public float getRotationY();
    method public float getRotationZ();
    method public float getScaleX();
    method public float getScaleY();
    method public float getShadowElevation();
    method public androidx.compose.ui.graphics.Shape getShape();
    method public default long getSpotShadowColor();
    method public long getTransformOrigin();
    method public float getTranslationX();
    method public float getTranslationY();
    method public void setAlpha(float);
    method public default void setAmbientShadowColor(long);
    method public void setCameraDistance(float);
    method public void setClip(boolean);
    method public default void setRenderEffect(androidx.compose.ui.graphics.RenderEffect?);
    method public void setRotationX(float);
    method public void setRotationY(float);
    method public void setRotationZ(float);
    method public void setScaleX(float);
    method public void setScaleY(float);
    method public void setShadowElevation(float);
    method public void setShape(androidx.compose.ui.graphics.Shape);
    method public default void setSpotShadowColor(long);
    method public void setTransformOrigin(long);
    method public void setTranslationX(float);
    method public void setTranslationY(float);
    property public abstract float alpha;
    property public default long ambientShadowColor;
    property public abstract float cameraDistance;
    property public abstract boolean clip;
    property public default androidx.compose.ui.graphics.RenderEffect? renderEffect;
    property public abstract float rotationX;
    property public abstract float rotationY;
    property public abstract float rotationZ;
    property public abstract float scaleX;
    property public abstract float scaleY;
    property public abstract float shadowElevation;
    property public abstract androidx.compose.ui.graphics.Shape shape;
    property public default long spotShadowColor;
    property public abstract long transformOrigin;
    property public abstract float translationX;
    property public abstract float translationY;
  }

  public final class GraphicsLayerScopeKt {
    method public static androidx.compose.ui.graphics.GraphicsLayerScope GraphicsLayerScope();
    method public static long getDefaultShadowColor();
    property public static final long DefaultShadowColor;
    field public static final float DefaultCameraDistance = 8.0f;
  }

  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class TransformOrigin {
    method @androidx.compose.runtime.Stable public inline operator float component1();
    method @androidx.compose.runtime.Stable public inline operator float component2();
    method public long copy(optional float pivotFractionX, optional float pivotFractionY);
    method public float getPivotFractionX();
    method public float getPivotFractionY();
    property public final float pivotFractionX;
    property public final float pivotFractionY;
    field public static final androidx.compose.ui.graphics.TransformOrigin.Companion Companion;
  }

  public static final class TransformOrigin.Companion {
    method public long getCenter();
    property public final long Center;
  }

  public final class TransformOriginKt {
    method public static long TransformOrigin(float pivotFractionX, float pivotFractionY);
  }

}

package androidx.compose.ui.graphics.vector {

  @androidx.compose.runtime.Immutable public final class ImageVector {
    method public boolean getAutoMirror();
    method public float getDefaultHeight();
    method public float getDefaultWidth();
    method public String getName();
    method public androidx.compose.ui.graphics.vector.VectorGroup getRoot();
    method public int getTintBlendMode();
    method public long getTintColor();
    method public float getViewportHeight();
    method public float getViewportWidth();
    property public final boolean autoMirror;
    property public final float defaultHeight;
    property public final float defaultWidth;
    property public final String name;
    property public final androidx.compose.ui.graphics.vector.VectorGroup root;
    property public final int tintBlendMode;
    property public final long tintColor;
    property public final float viewportHeight;
    property public final float viewportWidth;
    field public static final androidx.compose.ui.graphics.vector.ImageVector.Companion Companion;
  }

  public static final class ImageVector.Builder {
    ctor public ImageVector.Builder(optional String name, float defaultWidth, float defaultHeight, float viewportWidth, float viewportHeight, optional long tintColor, optional int tintBlendMode, optional boolean autoMirror);
    ctor @Deprecated public ImageVector.Builder(optional String name, float defaultWidth, float defaultHeight, float viewportWidth, float viewportHeight, optional long tintColor, optional int tintBlendMode);
    method public androidx.compose.ui.graphics.vector.ImageVector.Builder addGroup(optional String name, optional float rotate, optional float pivotX, optional float pivotY, optional float scaleX, optional float scaleY, optional float translationX, optional float translationY, optional java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> clipPathData);
    method public androidx.compose.ui.graphics.vector.ImageVector.Builder addPath(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> pathData, optional int pathFillType, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional int strokeLineCap, optional int strokeLineJoin, optional float strokeLineMiter, optional float trimPathStart, optional float trimPathEnd, optional float trimPathOffset);
    method public androidx.compose.ui.graphics.vector.ImageVector build();
    method public androidx.compose.ui.graphics.vector.ImageVector.Builder clearGroup();
  }

  public static final class ImageVector.Companion {
  }

  public final class ImageVectorKt {
    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder group(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional String name, optional float rotate, optional float pivotX, optional float pivotY, optional float scaleX, optional float scaleY, optional float translationX, optional float translationY, optional java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> clipPathData, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.ImageVector.Builder,kotlin.Unit> block);
    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder path(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional int strokeLineCap, optional int strokeLineJoin, optional float strokeLineMiter, optional int pathFillType, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> pathBuilder);
  }

  public abstract sealed class VNode {
    method public abstract void draw(androidx.compose.ui.graphics.drawscope.DrawScope);
    method public final void invalidate();
  }

  public final class VectorApplier extends androidx.compose.runtime.AbstractApplier<androidx.compose.ui.graphics.vector.VNode> {
    ctor public VectorApplier(androidx.compose.ui.graphics.vector.VNode root);
    method public void insertBottomUp(int index, androidx.compose.ui.graphics.vector.VNode instance);
    method public void insertTopDown(int index, androidx.compose.ui.graphics.vector.VNode instance);
    method public void move(int from, int to, int count);
    method protected void onClear();
    method public void remove(int index, int count);
  }

  @androidx.compose.runtime.ComposableTargetMarker(description="Vector Composable") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FILE, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.TYPE, kotlin.annotation.AnnotationTarget.TYPE_PARAMETER}) public @interface VectorComposable {
  }

  public final class VectorComposeKt {
    method @androidx.compose.runtime.Composable @androidx.compose.ui.graphics.vector.VectorComposable public static void Group(optional String name, optional float rotation, optional float pivotX, optional float pivotY, optional float scaleX, optional float scaleY, optional float translationX, optional float translationY, optional java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> clipPathData, kotlin.jvm.functions.Function0<kotlin.Unit> content);
    method @androidx.compose.runtime.Composable @androidx.compose.ui.graphics.vector.VectorComposable public static void Path(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> pathData, optional int pathFillType, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional int strokeLineCap, optional int strokeLineJoin, optional float strokeLineMiter, optional float trimPathStart, optional float trimPathEnd, optional float trimPathOffset);
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface VectorConfig {
    method public default <T> T! getOrDefault(androidx.compose.ui.graphics.vector.VectorProperty<T> property, T? defaultValue);
  }

  @androidx.compose.runtime.Immutable public final class VectorGroup extends androidx.compose.ui.graphics.vector.VectorNode implements java.lang.Iterable<androidx.compose.ui.graphics.vector.VectorNode> kotlin.jvm.internal.markers.KMappedMarker {
    method public operator androidx.compose.ui.graphics.vector.VectorNode get(int index);
    method public java.util.List<androidx.compose.ui.graphics.vector.PathNode> getClipPathData();
    method public String getName();
    method public float getPivotX();
    method public float getPivotY();
    method public float getRotation();
    method public float getScaleX();
    method public float getScaleY();
    method public int getSize();
    method public float getTranslationX();
    method public float getTranslationY();
    method public java.util.Iterator<androidx.compose.ui.graphics.vector.VectorNode> iterator();
    property public final java.util.List<androidx.compose.ui.graphics.vector.PathNode> clipPathData;
    property public final String name;
    property public final float pivotX;
    property public final float pivotY;
    property public final float rotation;
    property public final float scaleX;
    property public final float scaleY;
    property public final int size;
    property public final float translationX;
    property public final float translationY;
  }

  public final class VectorKt {
    method public static inline java.util.List<androidx.compose.ui.graphics.vector.PathNode> PathData(kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> block);
    method public static java.util.List<androidx.compose.ui.graphics.vector.PathNode> addPathNodes(String? pathStr);
    method public static int getDefaultFillType();
    method public static int getDefaultStrokeLineCap();
    method public static int getDefaultStrokeLineJoin();
    method public static int getDefaultTintBlendMode();
    method public static long getDefaultTintColor();
    method public static java.util.List<androidx.compose.ui.graphics.vector.PathNode> getEmptyPath();
    property public static final int DefaultFillType;
    property public static final int DefaultStrokeLineCap;
    property public static final int DefaultStrokeLineJoin;
    property public static final int DefaultTintBlendMode;
    property public static final long DefaultTintColor;
    property public static final java.util.List<androidx.compose.ui.graphics.vector.PathNode> EmptyPath;
    field public static final String DefaultGroupName = "";
    field public static final String DefaultPathName = "";
    field public static final float DefaultPivotX = 0.0f;
    field public static final float DefaultPivotY = 0.0f;
    field public static final float DefaultRotation = 0.0f;
    field public static final float DefaultScaleX = 1.0f;
    field public static final float DefaultScaleY = 1.0f;
    field public static final float DefaultStrokeLineMiter = 4.0f;
    field public static final float DefaultStrokeLineWidth = 0.0f;
    field public static final float DefaultTranslationX = 0.0f;
    field public static final float DefaultTranslationY = 0.0f;
    field public static final float DefaultTrimPathEnd = 1.0f;
    field public static final float DefaultTrimPathOffset = 0.0f;
    field public static final float DefaultTrimPathStart = 0.0f;
  }

  public abstract sealed class VectorNode {
  }

  public final class VectorPainter extends androidx.compose.ui.graphics.painter.Painter {
    method public long getIntrinsicSize();
    method protected void onDraw(androidx.compose.ui.graphics.drawscope.DrawScope);
    property public long intrinsicSize;
  }

  public final class VectorPainterKt {
    method @androidx.compose.runtime.Composable public static void RenderVectorGroup(androidx.compose.ui.graphics.vector.VectorGroup group, optional java.util.Map<java.lang.String,? extends androidx.compose.ui.graphics.vector.VectorConfig> configs);
    method @Deprecated @androidx.compose.runtime.Composable @androidx.compose.runtime.ComposableOpenTarget(index=0xffffffff) public static androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter(float defaultWidth, float defaultHeight, optional float viewportWidth, optional float viewportHeight, optional String name, optional long tintColor, optional int tintBlendMode, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,kotlin.Unit> content);
    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ComposableOpenTarget(index=0xffffffff) public static androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter(float defaultWidth, float defaultHeight, optional float viewportWidth, optional float viewportHeight, optional String name, optional long tintColor, optional int tintBlendMode, optional boolean autoMirror, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,kotlin.Unit> content);
    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter(androidx.compose.ui.graphics.vector.ImageVector image);
    field public static final String RootGroupName = "VectorRootGroup";
  }

  @androidx.compose.runtime.Immutable public final class VectorPath extends androidx.compose.ui.graphics.vector.VectorNode {
    method public androidx.compose.ui.graphics.Brush? getFill();
    method public float getFillAlpha();
    method public String getName();
    method public java.util.List<androidx.compose.ui.graphics.vector.PathNode> getPathData();
    method public int getPathFillType();
    method public androidx.compose.ui.graphics.Brush? getStroke();
    method public float getStrokeAlpha();
    method public int getStrokeLineCap();
    method public int getStrokeLineJoin();
    method public float getStrokeLineMiter();
    method public float getStrokeLineWidth();
    method public float getTrimPathEnd();
    method public float getTrimPathOffset();
    method public float getTrimPathStart();
    property public final androidx.compose.ui.graphics.Brush? fill;
    property public final float fillAlpha;
    property public final String name;
    property public final java.util.List<androidx.compose.ui.graphics.vector.PathNode> pathData;
    property public final int pathFillType;
    property public final androidx.compose.ui.graphics.Brush? stroke;
    property public final float strokeAlpha;
    property public final int strokeLineCap;
    property public final int strokeLineJoin;
    property public final float strokeLineMiter;
    property public final float strokeLineWidth;
    property public final float trimPathEnd;
    property public final float trimPathOffset;
    property public final float trimPathStart;
  }

  public abstract sealed class VectorProperty<T> {
  }

  public static final class VectorProperty.Fill extends androidx.compose.ui.graphics.vector.VectorProperty<androidx.compose.ui.graphics.Brush> {
    field public static final androidx.compose.ui.graphics.vector.VectorProperty.Fill INSTANCE;
  }

  public static final class VectorProperty.FillAlpha extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
    field public static final androidx.compose.ui.graphics.vector.VectorProperty.FillAlpha INSTANCE;
  }

  public static final class VectorProperty.PathData extends androidx.compose.ui.graphics.vector.VectorProperty<java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode>> {
    field public static final androidx.compose.ui.graphics.vector.VectorProperty.PathData INSTANCE;
  }

  public static final class VectorProperty.PivotX extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
    field public static final androidx.compose.ui.graphics.vector.VectorProperty.PivotX INSTANCE;
  }

  public static final class VectorProperty.PivotY extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
    field public static final androidx.compose.ui.graphics.vector.VectorProperty.PivotY INSTANCE;
  }

  public static final class VectorProperty.Rotation extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
    field public static final androidx.compose.ui.graphics.vector.VectorProperty.Rotation INSTANCE;
  }

  public static final class VectorProperty.ScaleX extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
    field public static final androidx.compose.ui.graphics.vector.VectorProperty.ScaleX INSTANCE;
  }

  public static final class VectorProperty.ScaleY extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
    field public static final androidx.compose.ui.graphics.vector.VectorProperty.ScaleY INSTANCE;
  }

  public static final class VectorProperty.Stroke extends androidx.compose.ui.graphics.vector.VectorProperty<androidx.compose.ui.graphics.Brush> {
    field public static final androidx.compose.ui.graphics.vector.VectorProperty.Stroke INSTANCE;
  }

  public static final class VectorProperty.StrokeAlpha extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
    field public static final androidx.compose.ui.graphics.vector.VectorProperty.StrokeAlpha INSTANCE;
  }

  public static final class VectorProperty.StrokeLineWidth extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
    field public static final androidx.compose.ui.graphics.vector.VectorProperty.StrokeLineWidth INSTANCE;
  }

  public static final class VectorProperty.TranslateX extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
    field public static final androidx.compose.ui.graphics.vector.VectorProperty.TranslateX INSTANCE;
  }

  public static final class VectorProperty.TranslateY extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
    field public static final androidx.compose.ui.graphics.vector.VectorProperty.TranslateY INSTANCE;
  }

  public static final class VectorProperty.TrimPathEnd extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
    field public static final androidx.compose.ui.graphics.vector.VectorProperty.TrimPathEnd INSTANCE;
  }

  public static final class VectorProperty.TrimPathOffset extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
    field public static final androidx.compose.ui.graphics.vector.VectorProperty.TrimPathOffset INSTANCE;
  }

  public static final class VectorProperty.TrimPathStart extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
    field public static final androidx.compose.ui.graphics.vector.VectorProperty.TrimPathStart INSTANCE;
  }

}

package androidx.compose.ui.graphics.vector.compat {

  public final class XmlVectorParser_androidKt {
  }

}

package androidx.compose.ui.hapticfeedback {

  public interface HapticFeedback {
    method public void performHapticFeedback(int hapticFeedbackType);
  }

  @kotlin.jvm.JvmInline public final value class HapticFeedbackType {
    ctor public HapticFeedbackType(int value);
    field public static final androidx.compose.ui.hapticfeedback.HapticFeedbackType.Companion Companion;
  }

  public static final class HapticFeedbackType.Companion {
    method public int getLongPress();
    method public int getTextHandleMove();
    method public java.util.List<androidx.compose.ui.hapticfeedback.HapticFeedbackType> values();
    property public final int LongPress;
    property public final int TextHandleMove;
  }

}

package androidx.compose.ui.input {

  @kotlin.jvm.JvmInline public final value class InputMode {
    field public static final androidx.compose.ui.input.InputMode.Companion Companion;
  }

  public static final class InputMode.Companion {
    method public int getKeyboard();
    method public int getTouch();
    property public final int Keyboard;
    property public final int Touch;
  }

  public interface InputModeManager {
    method public int getInputMode();
    property public abstract int inputMode;
  }

}

package androidx.compose.ui.input.key {

  @kotlin.jvm.JvmInline public final value class Key {
    ctor public Key(long keyCode);
    method public long getKeyCode();
    property public final long keyCode;
    field public static final androidx.compose.ui.input.key.Key.Companion Companion;
  }

  public static final class Key.Companion {
    method public long getA();
    method public long getAllApps();
    method public long getAltLeft();
    method public long getAltRight();
    method public long getApostrophe();
    method public long getAppSwitch();
    method public long getAssist();
    method public long getAt();
    method public long getAvReceiverInput();
    method public long getAvReceiverPower();
    method public long getB();
    method public long getBack();
    method public long getBackslash();
    method public long getBackspace();
    method public long getBookmark();
    method public long getBreak();
    method public long getBrightnessDown();
    method public long getBrightnessUp();
    method public long getBrowser();
    method public long getButton1();
    method public long getButton10();
    method public long getButton11();
    method public long getButton12();
    method public long getButton13();
    method public long getButton14();
    method public long getButton15();
    method public long getButton16();
    method public long getButton2();
    method public long getButton3();
    method public long getButton4();
    method public long getButton5();
    method public long getButton6();
    method public long getButton7();
    method public long getButton8();
    method public long getButton9();
    method public long getButtonA();
    method public long getButtonB();
    method public long getButtonC();
    method public long getButtonL1();
    method public long getButtonL2();
    method public long getButtonMode();
    method public long getButtonR1();
    method public long getButtonR2();
    method public long getButtonSelect();
    method public long getButtonStart();
    method public long getButtonThumbLeft();
    method public long getButtonThumbRight();
    method public long getButtonX();
    method public long getButtonY();
    method public long getButtonZ();
    method public long getC();
    method public long getCalculator();
    method public long getCalendar();
    method public long getCall();
    method public long getCamera();
    method public long getCapsLock();
    method public long getCaptions();
    method public long getChannelDown();
    method public long getChannelUp();
    method public long getClear();
    method public long getComma();
    method public long getContacts();
    method public long getCopy();
    method public long getCtrlLeft();
    method public long getCtrlRight();
    method public long getCut();
    method public long getD();
    method public long getDelete();
    method public long getDirectionCenter();
    method public long getDirectionDown();
    method public long getDirectionDownLeft();
    method public long getDirectionDownRight();
    method public long getDirectionLeft();
    method public long getDirectionRight();
    method public long getDirectionUp();
    method public long getDirectionUpLeft();
    method public long getDirectionUpRight();
    method public long getDvr();
    method public long getE();
    method public long getEight();
    method public long getEisu();
    method public long getEndCall();
    method public long getEnter();
    method public long getEnvelope();
    method public long getEquals();
    method public long getEscape();
    method public long getF();
    method public long getF1();
    method public long getF10();
    method public long getF11();
    method public long getF12();
    method public long getF2();
    method public long getF3();
    method public long getF4();
    method public long getF5();
    method public long getF6();
    method public long getF7();
    method public long getF8();
    method public long getF9();
    method public long getFive();
    method public long getFocus();
    method public long getForward();
    method public long getFour();
    method public long getFunction();
    method public long getG();
    method public long getGrave();
    method public long getGuide();
    method public long getH();
    method public long getHeadsetHook();
    method public long getHelp();
    method public long getHenkan();
    method public long getHome();
    method public long getI();
    method public long getInfo();
    method public long getInsert();
    method public long getJ();
    method public long getK();
    method public long getKana();
    method public long getKatakanaHiragana();
    method public long getL();
    method public long getLanguageSwitch();
    method public long getLastChannel();
    method public long getLeftBracket();
    method public long getM();
    method public long getMannerMode();
    method public long getMediaAudioTrack();
    method public long getMediaClose();
    method public long getMediaEject();
    method public long getMediaFastForward();
    method public long getMediaNext();
    method public long getMediaPause();
    method public long getMediaPlay();
    method public long getMediaPlayPause();
    method public long getMediaPrevious();
    method public long getMediaRecord();
    method public long getMediaRewind();
    method public long getMediaSkipBackward();
    method public long getMediaSkipForward();
    method public long getMediaStepBackward();
    method public long getMediaStepForward();
    method public long getMediaStop();
    method public long getMediaTopMenu();
    method public long getMenu();
    method public long getMetaLeft();
    method public long getMetaRight();
    method public long getMicrophoneMute();
    method public long getMinus();
    method public long getMoveEnd();
    method public long getMoveHome();
    method public long getMuhenkan();
    method public long getMultiply();
    method public long getMusic();
    method public long getN();
    method public long getNavigateIn();
    method public long getNavigateNext();
    method public long getNavigateOut();
    method public long getNavigatePrevious();
    method public long getNine();
    method public long getNotification();
    method public long getNumLock();
    method public long getNumPad0();
    method public long getNumPad1();
    method public long getNumPad2();
    method public long getNumPad3();
    method public long getNumPad4();
    method public long getNumPad5();
    method public long getNumPad6();
    method public long getNumPad7();
    method public long getNumPad8();
    method public long getNumPad9();
    method public long getNumPadAdd();
    method public long getNumPadComma();
    method public long getNumPadDivide();
    method public long getNumPadDot();
    method public long getNumPadEnter();
    method public long getNumPadEquals();
    method public long getNumPadLeftParenthesis();
    method public long getNumPadMultiply();
    method public long getNumPadRightParenthesis();
    method public long getNumPadSubtract();
    method public long getNumber();
    method public long getO();
    method public long getOne();
    method public long getP();
    method public long getPageDown();
    method public long getPageUp();
    method public long getPairing();
    method public long getPaste();
    method public long getPeriod();
    method public long getPictureSymbols();
    method public long getPlus();
    method public long getPound();
    method public long getPower();
    method public long getPrintScreen();
    method public long getProfileSwitch();
    method public long getProgramBlue();
    method public long getProgramGreen();
    method public long getProgramRed();
    method public long getProgramYellow();
    method public long getQ();
    method public long getR();
    method public long getRefresh();
    method public long getRightBracket();
    method public long getRo();
    method public long getS();
    method public long getScrollLock();
    method public long getSearch();
    method public long getSemicolon();
    method public long getSetTopBoxInput();
    method public long getSetTopBoxPower();
    method public long getSettings();
    method public long getSeven();
    method public long getShiftLeft();
    method public long getShiftRight();
    method public long getSix();
    method public long getSlash();
    method public long getSleep();
    method public long getSoftLeft();
    method public long getSoftRight();
    method public long getSoftSleep();
    method public long getSpacebar();
    method public long getStem1();
    method public long getStem2();
    method public long getStem3();
    method public long getStemPrimary();
    method public long getSwitchCharset();
    method public long getSymbol();
    method public long getSystemNavigationDown();
    method public long getSystemNavigationLeft();
    method public long getSystemNavigationRight();
    method public long getSystemNavigationUp();
    method public long getT();
    method public long getTab();
    method public long getThree();
    method public long getThumbsDown();
    method public long getThumbsUp();
    method public long getToggle2D3D();
    method public long getTv();
    method public long getTvAntennaCable();
    method public long getTvAudioDescription();
    method public long getTvAudioDescriptionMixingVolumeDown();
    method public long getTvAudioDescriptionMixingVolumeUp();
    method public long getTvContentsMenu();
    method public long getTvDataService();
    method public long getTvInput();
    method public long getTvInputComponent1();
    method public long getTvInputComponent2();
    method public long getTvInputComposite1();
    method public long getTvInputComposite2();
    method public long getTvInputHdmi1();
    method public long getTvInputHdmi2();
    method public long getTvInputHdmi3();
    method public long getTvInputHdmi4();
    method public long getTvInputVga1();
    method public long getTvMediaContextMenu();
    method public long getTvNetwork();
    method public long getTvNumberEntry();
    method public long getTvPower();
    method public long getTvRadioService();
    method public long getTvSatellite();
    method public long getTvSatelliteBs();
    method public long getTvSatelliteCs();
    method public long getTvSatelliteService();
    method public long getTvTeletext();
    method public long getTvTerrestrialAnalog();
    method public long getTvTerrestrialDigital();
    method public long getTvTimerProgramming();
    method public long getTvZoomMode();
    method public long getTwo();
    method public long getU();
    method public long getUnknown();
    method public long getV();
    method public long getVoiceAssist();
    method public long getVolumeDown();
    method public long getVolumeMute();
    method public long getVolumeUp();
    method public long getW();
    method public long getWakeUp();
    method public long getWindow();
    method public long getX();
    method public long getY();
    method public long getYen();
    method public long getZ();
    method public long getZenkakuHankaru();
    method public long getZero();
    method public long getZoomIn();
    method public long getZoomOut();
    property public final long A;
    property public final long AllApps;
    property public final long AltLeft;
    property public final long AltRight;
    property public final long Apostrophe;
    property public final long AppSwitch;
    property public final long Assist;
    property public final long At;
    property public final long AvReceiverInput;
    property public final long AvReceiverPower;
    property public final long B;
    property public final long Back;
    property public final long Backslash;
    property public final long Backspace;
    property public final long Bookmark;
    property public final long Break;
    property public final long BrightnessDown;
    property public final long BrightnessUp;
    property public final long Browser;
    property public final long Button1;
    property public final long Button10;
    property public final long Button11;
    property public final long Button12;
    property public final long Button13;
    property public final long Button14;
    property public final long Button15;
    property public final long Button16;
    property public final long Button2;
    property public final long Button3;
    property public final long Button4;
    property public final long Button5;
    property public final long Button6;
    property public final long Button7;
    property public final long Button8;
    property public final long Button9;
    property public final long ButtonA;
    property public final long ButtonB;
    property public final long ButtonC;
    property public final long ButtonL1;
    property public final long ButtonL2;
    property public final long ButtonMode;
    property public final long ButtonR1;
    property public final long ButtonR2;
    property public final long ButtonSelect;
    property public final long ButtonStart;
    property public final long ButtonThumbLeft;
    property public final long ButtonThumbRight;
    property public final long ButtonX;
    property public final long ButtonY;
    property public final long ButtonZ;
    property public final long C;
    property public final long Calculator;
    property public final long Calendar;
    property public final long Call;
    property public final long Camera;
    property public final long CapsLock;
    property public final long Captions;
    property public final long ChannelDown;
    property public final long ChannelUp;
    property public final long Clear;
    property public final long Comma;
    property public final long Contacts;
    property public final long Copy;
    property public final long CtrlLeft;
    property public final long CtrlRight;
    property public final long Cut;
    property public final long D;
    property public final long Delete;
    property public final long DirectionCenter;
    property public final long DirectionDown;
    property public final long DirectionDownLeft;
    property public final long DirectionDownRight;
    property public final long DirectionLeft;
    property public final long DirectionRight;
    property public final long DirectionUp;
    property public final long DirectionUpLeft;
    property public final long DirectionUpRight;
    property public final long Dvr;
    property public final long E;
    property public final long Eight;
    property public final long Eisu;
    property public final long EndCall;
    property public final long Enter;
    property public final long Envelope;
    property public final long Equals;
    property public final long Escape;
    property public final long F;
    property public final long F1;
    property public final long F10;
    property public final long F11;
    property public final long F12;
    property public final long F2;
    property public final long F3;
    property public final long F4;
    property public final long F5;
    property public final long F6;
    property public final long F7;
    property public final long F8;
    property public final long F9;
    property public final long Five;
    property public final long Focus;
    property public final long Forward;
    property public final long Four;
    property public final long Function;
    property public final long G;
    property public final long Grave;
    property public final long Guide;
    property public final long H;
    property public final long HeadsetHook;
    property public final long Help;
    property public final long Henkan;
    property public final long Home;
    property public final long I;
    property public final long Info;
    property public final long Insert;
    property public final long J;
    property public final long K;
    property public final long Kana;
    property public final long KatakanaHiragana;
    property public final long L;
    property public final long LanguageSwitch;
    property public final long LastChannel;
    property public final long LeftBracket;
    property public final long M;
    property public final long MannerMode;
    property public final long MediaAudioTrack;
    property public final long MediaClose;
    property public final long MediaEject;
    property public final long MediaFastForward;
    property public final long MediaNext;
    property public final long MediaPause;
    property public final long MediaPlay;
    property public final long MediaPlayPause;
    property public final long MediaPrevious;
    property public final long MediaRecord;
    property public final long MediaRewind;
    property public final long MediaSkipBackward;
    property public final long MediaSkipForward;
    property public final long MediaStepBackward;
    property public final long MediaStepForward;
    property public final long MediaStop;
    property public final long MediaTopMenu;
    property public final long Menu;
    property public final long MetaLeft;
    property public final long MetaRight;
    property public final long MicrophoneMute;
    property public final long Minus;
    property public final long MoveEnd;
    property public final long MoveHome;
    property public final long Muhenkan;
    property public final long Multiply;
    property public final long Music;
    property public final long N;
    property public final long NavigateIn;
    property public final long NavigateNext;
    property public final long NavigateOut;
    property public final long NavigatePrevious;
    property public final long Nine;
    property public final long Notification;
    property public final long NumLock;
    property public final long NumPad0;
    property public final long NumPad1;
    property public final long NumPad2;
    property public final long NumPad3;
    property public final long NumPad4;
    property public final long NumPad5;
    property public final long NumPad6;
    property public final long NumPad7;
    property public final long NumPad8;
    property public final long NumPad9;
    property public final long NumPadAdd;
    property public final long NumPadComma;
    property public final long NumPadDivide;
    property public final long NumPadDot;
    property public final long NumPadEnter;
    property public final long NumPadEquals;
    property public final long NumPadLeftParenthesis;
    property public final long NumPadMultiply;
    property public final long NumPadRightParenthesis;
    property public final long NumPadSubtract;
    property public final long Number;
    property public final long O;
    property public final long One;
    property public final long P;
    property public final long PageDown;
    property public final long PageUp;
    property public final long Pairing;
    property public final long Paste;
    property public final long Period;
    property public final long PictureSymbols;
    property public final long Plus;
    property public final long Pound;
    property public final long Power;
    property public final long PrintScreen;
    property public final long ProfileSwitch;
    property public final long ProgramBlue;
    property public final long ProgramGreen;
    property public final long ProgramRed;
    property public final long ProgramYellow;
    property public final long Q;
    property public final long R;
    property public final long Refresh;
    property public final long RightBracket;
    property public final long Ro;
    property public final long S;
    property public final long ScrollLock;
    property public final long Search;
    property public final long Semicolon;
    property public final long SetTopBoxInput;
    property public final long SetTopBoxPower;
    property public final long Settings;
    property public final long Seven;
    property public final long ShiftLeft;
    property public final long ShiftRight;
    property public final long Six;
    property public final long Slash;
    property public final long Sleep;
    property public final long SoftLeft;
    property public final long SoftRight;
    property public final long SoftSleep;
    property public final long Spacebar;
    property public final long Stem1;
    property public final long Stem2;
    property public final long Stem3;
    property public final long StemPrimary;
    property public final long SwitchCharset;
    property public final long Symbol;
    property public final long SystemNavigationDown;
    property public final long SystemNavigationLeft;
    property public final long SystemNavigationRight;
    property public final long SystemNavigationUp;
    property public final long T;
    property public final long Tab;
    property public final long Three;
    property public final long ThumbsDown;
    property public final long ThumbsUp;
    property public final long Toggle2D3D;
    property public final long Tv;
    property public final long TvAntennaCable;
    property public final long TvAudioDescription;
    property public final long TvAudioDescriptionMixingVolumeDown;
    property public final long TvAudioDescriptionMixingVolumeUp;
    property public final long TvContentsMenu;
    property public final long TvDataService;
    property public final long TvInput;
    property public final long TvInputComponent1;
    property public final long TvInputComponent2;
    property public final long TvInputComposite1;
    property public final long TvInputComposite2;
    property public final long TvInputHdmi1;
    property public final long TvInputHdmi2;
    property public final long TvInputHdmi3;
    property public final long TvInputHdmi4;
    property public final long TvInputVga1;
    property public final long TvMediaContextMenu;
    property public final long TvNetwork;
    property public final long TvNumberEntry;
    property public final long TvPower;
    property public final long TvRadioService;
    property public final long TvSatellite;
    property public final long TvSatelliteBs;
    property public final long TvSatelliteCs;
    property public final long TvSatelliteService;
    property public final long TvTeletext;
    property public final long TvTerrestrialAnalog;
    property public final long TvTerrestrialDigital;
    property public final long TvTimerProgramming;
    property public final long TvZoomMode;
    property public final long Two;
    property public final long U;
    property public final long Unknown;
    property public final long V;
    property public final long VoiceAssist;
    property public final long VolumeDown;
    property public final long VolumeMute;
    property public final long VolumeUp;
    property public final long W;
    property public final long WakeUp;
    property public final long Window;
    property public final long X;
    property public final long Y;
    property public final long Yen;
    property public final long Z;
    property public final long ZenkakuHankaru;
    property public final long Zero;
    property public final long ZoomIn;
    property public final long ZoomOut;
  }

  @kotlin.jvm.JvmInline public final value class KeyEvent {
    ctor public KeyEvent(android.view.KeyEvent nativeKeyEvent);
    method public android.view.KeyEvent getNativeKeyEvent();
    property public final android.view.KeyEvent nativeKeyEvent;
  }

  @kotlin.jvm.JvmInline public final value class KeyEventType {
    field public static final androidx.compose.ui.input.key.KeyEventType.Companion Companion;
  }

  public static final class KeyEventType.Companion {
    method public int getKeyDown();
    method public int getKeyUp();
    method public int getUnknown();
    property public final int KeyDown;
    property public final int KeyUp;
    property public final int Unknown;
  }

  public final class KeyEvent_androidKt {
    method public static long getKey(android.view.KeyEvent);
    method public static int getType(android.view.KeyEvent);
    method public static int getUtf16CodePoint(android.view.KeyEvent);
    method public static boolean isAltPressed(android.view.KeyEvent);
    method public static boolean isCtrlPressed(android.view.KeyEvent);
    method public static boolean isMetaPressed(android.view.KeyEvent);
    method public static boolean isShiftPressed(android.view.KeyEvent);
  }

  public final class KeyInputModifierKt {
    method public static androidx.compose.ui.Modifier onKeyEvent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.key.KeyEvent,java.lang.Boolean> onKeyEvent);
    method public static androidx.compose.ui.Modifier onPreviewKeyEvent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.key.KeyEvent,java.lang.Boolean> onPreviewKeyEvent);
  }

  public final class Key_androidKt {
    method public static long Key(int nativeKeyCode);
    method public static int getNativeKeyCode(long);
  }

}

package androidx.compose.ui.input.nestedscroll {

  @kotlin.jvm.JvmDefaultWithCompatibility public interface NestedScrollConnection {
    method public default suspend Object? onPostFling(long consumed, long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity>);
    method public default long onPostScroll(long consumed, long available, int source);
    method public default suspend Object? onPreFling(long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity>);
    method public default long onPreScroll(long available, int source);
  }

  public final class NestedScrollDispatcher {
    ctor public NestedScrollDispatcher();
    method public suspend Object? dispatchPostFling(long consumed, long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity>);
    method public long dispatchPostScroll(long consumed, long available, int source);
    method public suspend Object? dispatchPreFling(long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity>);
    method public long dispatchPreScroll(long available, int source);
    method public kotlinx.coroutines.CoroutineScope getCoroutineScope();
    property public final kotlinx.coroutines.CoroutineScope coroutineScope;
  }

  public final class NestedScrollModifierKt {
    method public static androidx.compose.ui.Modifier nestedScroll(androidx.compose.ui.Modifier, androidx.compose.ui.input.nestedscroll.NestedScrollConnection connection, optional androidx.compose.ui.input.nestedscroll.NestedScrollDispatcher? dispatcher);
  }

  public final class NestedScrollModifierLocalKt {
  }

  @kotlin.jvm.JvmInline public final value class NestedScrollSource {
    field public static final androidx.compose.ui.input.nestedscroll.NestedScrollSource.Companion Companion;
  }

  public static final class NestedScrollSource.Companion {
    method public int getDrag();
    method public int getFling();
    method @Deprecated public int getRelocate();
    property public final int Drag;
    property public final int Fling;
    property @Deprecated public final int Relocate;
  }

}

package androidx.compose.ui.input.pointer {

  @kotlin.coroutines.RestrictsSuspension @kotlin.jvm.JvmDefaultWithCompatibility public interface AwaitPointerEventScope extends androidx.compose.ui.unit.Density {
    method public suspend Object? awaitPointerEvent(optional androidx.compose.ui.input.pointer.PointerEventPass pass, optional kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerEvent>);
    method public androidx.compose.ui.input.pointer.PointerEvent getCurrentEvent();
    method public default long getExtendedTouchPadding();
    method public long getSize();
    method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
    method public default suspend <T> Object? withTimeout(long timeMillis, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.AwaitPointerEventScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
    method public default suspend <T> Object? withTimeoutOrNull(long timeMillis, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.AwaitPointerEventScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T>);
    property public abstract androidx.compose.ui.input.pointer.PointerEvent currentEvent;
    property public default long extendedTouchPadding;
    property public abstract long size;
    property public abstract androidx.compose.ui.platform.ViewConfiguration viewConfiguration;
  }

  @Deprecated public final class ConsumedData {
    ctor @Deprecated public ConsumedData(optional @Deprecated boolean positionChange, optional @Deprecated boolean downChange);
    method @Deprecated public boolean getDownChange();
    method @Deprecated public boolean getPositionChange();
    method @Deprecated public void setDownChange(boolean);
    method @Deprecated public void setPositionChange(boolean);
    property @Deprecated public final boolean downChange;
    property @Deprecated public final boolean positionChange;
  }

  @kotlin.jvm.JvmInline public final value class PointerButtons {
    ctor public PointerButtons(int packedValue);
  }

  public final class PointerEvent {
    ctor public PointerEvent(java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> changes);
    method public java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> component1();
    method public androidx.compose.ui.input.pointer.PointerEvent copy(java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> changes, android.view.MotionEvent? motionEvent);
    method public int getButtons();
    method public java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> getChanges();
    method public int getKeyboardModifiers();
    method public int getType();
    property public final int buttons;
    property public final java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> changes;
    property public final int keyboardModifiers;
    property public final int type;
  }

  public final class PointerEventKt {
    method @Deprecated public static boolean anyChangeConsumed(androidx.compose.ui.input.pointer.PointerInputChange);
    method public static boolean changedToDown(androidx.compose.ui.input.pointer.PointerInputChange);
    method public static boolean changedToDownIgnoreConsumed(androidx.compose.ui.input.pointer.PointerInputChange);
    method public static boolean changedToUp(androidx.compose.ui.input.pointer.PointerInputChange);
    method public static boolean changedToUpIgnoreConsumed(androidx.compose.ui.input.pointer.PointerInputChange);
    method @Deprecated public static void consumeAllChanges(androidx.compose.ui.input.pointer.PointerInputChange);
    method @Deprecated public static void consumeDownChange(androidx.compose.ui.input.pointer.PointerInputChange);
    method @Deprecated public static void consumePositionChange(androidx.compose.ui.input.pointer.PointerInputChange);
    method public static int indexOfFirstPressed(int);
    method public static int indexOfLastPressed(int);
    method @Deprecated public static boolean isOutOfBounds(androidx.compose.ui.input.pointer.PointerInputChange, long size);
    method public static boolean isOutOfBounds(androidx.compose.ui.input.pointer.PointerInputChange, long size, long extendedTouchPadding);
    method public static boolean isPressed(int, int buttonIndex);
    method public static long positionChange(androidx.compose.ui.input.pointer.PointerInputChange);
    method @Deprecated public static boolean positionChangeConsumed(androidx.compose.ui.input.pointer.PointerInputChange);
    method public static long positionChangeIgnoreConsumed(androidx.compose.ui.input.pointer.PointerInputChange);
    method public static boolean positionChanged(androidx.compose.ui.input.pointer.PointerInputChange);
    method public static boolean positionChangedIgnoreConsumed(androidx.compose.ui.input.pointer.PointerInputChange);
  }

  public enum PointerEventPass {
    method public static androidx.compose.ui.input.pointer.PointerEventPass valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.compose.ui.input.pointer.PointerEventPass[] values();
    enum_constant public static final androidx.compose.ui.input.pointer.PointerEventPass Final;
    enum_constant public static final androidx.compose.ui.input.pointer.PointerEventPass Initial;
    enum_constant public static final androidx.compose.ui.input.pointer.PointerEventPass Main;
  }

  public final class PointerEventTimeoutCancellationException extends java.util.concurrent.CancellationException {
    ctor public PointerEventTimeoutCancellationException(long time);
  }

  @kotlin.jvm.JvmInline public final value class PointerEventType {
    field public static final androidx.compose.ui.input.pointer.PointerEventType.Companion Companion;
  }

  public static final class PointerEventType.Companion {
    method public int getEnter();
    method public int getExit();
    method public int getMove();
    method public int getPress();
    method public int getRelease();
    method public int getScroll();
    method public int getUnknown();
    property public final int Enter;
    property public final int Exit;
    property public final int Move;
    property public final int Press;
    property public final int Release;
    property public final int Scroll;
    property public final int Unknown;
  }

  public final class PointerEvent_androidKt {
    method public static boolean getAreAnyPressed(int);
    method public static int indexOfFirstPressed(int);
    method public static int indexOfLastPressed(int);
    method public static boolean isAltGraphPressed(int);
    method public static boolean isAltPressed(int);
    method public static boolean isBackPressed(int);
    method public static boolean isCapsLockOn(int);
    method public static boolean isCtrlPressed(int);
    method public static boolean isForwardPressed(int);
    method public static boolean isFunctionPressed(int);
    method public static boolean isMetaPressed(int);
    method public static boolean isNumLockOn(int);
    method public static boolean isPressed(int, int buttonIndex);
    method public static boolean isPrimaryPressed(int);
    method public static boolean isScrollLockOn(int);
    method public static boolean isSecondaryPressed(int);
    method public static boolean isShiftPressed(int);
    method public static boolean isSymPressed(int);
    method public static boolean isTertiaryPressed(int);
  }

  @androidx.compose.runtime.Stable public interface PointerIcon {
  }

  public final class PointerIconKt {
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier pointerHoverIcon(androidx.compose.ui.Modifier, androidx.compose.ui.input.pointer.PointerIcon icon, optional boolean overrideDescendants);
  }

  public final class PointerIcon_androidKt {
    method public static androidx.compose.ui.input.pointer.PointerIcon PointerIcon(android.view.PointerIcon pointerIcon);
    method public static androidx.compose.ui.input.pointer.PointerIcon PointerIcon(int pointerIconType);
  }

  @kotlin.jvm.JvmInline public final value class PointerId {
    ctor public PointerId(long value);
    method public long getValue();
    property public final long value;
  }

  @androidx.compose.runtime.Immutable public final class PointerInputChange {
    ctor public PointerInputChange(long id, long uptimeMillis, long position, boolean pressed, long previousUptimeMillis, long previousPosition, boolean previousPressed, boolean isInitiallyConsumed, optional int type, optional long scrollDelta);
    ctor @Deprecated public PointerInputChange(long id, long uptimeMillis, long position, boolean pressed, long previousUptimeMillis, long previousPosition, boolean previousPressed, androidx.compose.ui.input.pointer.ConsumedData consumed, optional int type);
    method public void consume();
    method public androidx.compose.ui.input.pointer.PointerInputChange copy(optional long id, optional long currentTime, optional long currentPosition, optional boolean currentPressed, optional long previousTime, optional long previousPosition, optional boolean previousPressed, optional int type, optional long scrollDelta);
    method @Deprecated public androidx.compose.ui.input.pointer.PointerInputChange copy(optional long id, optional long currentTime, optional long currentPosition, optional boolean currentPressed, optional long previousTime, optional long previousPosition, optional boolean previousPressed, androidx.compose.ui.input.pointer.ConsumedData consumed, optional int type, optional long scrollDelta);
    method @Deprecated public androidx.compose.ui.input.pointer.PointerInputChange! copy(optional long id, optional long currentTime, optional long currentPosition, optional boolean currentPressed, optional long previousTime, optional long previousPosition, optional boolean previousPressed, optional androidx.compose.ui.input.pointer.ConsumedData consumed, optional int type);
    method @Deprecated public androidx.compose.ui.input.pointer.ConsumedData getConsumed();
    method public long getId();
    method public long getPosition();
    method public boolean getPressed();
    method public long getPreviousPosition();
    method public boolean getPreviousPressed();
    method public long getPreviousUptimeMillis();
    method public long getScrollDelta();
    method public int getType();
    method public long getUptimeMillis();
    method public boolean isConsumed();
    property @Deprecated public final androidx.compose.ui.input.pointer.ConsumedData consumed;
    property public final long id;
    property public final boolean isConsumed;
    property public final long position;
    property public final boolean pressed;
    property public final long previousPosition;
    property public final boolean previousPressed;
    property public final long previousUptimeMillis;
    property public final long scrollDelta;
    property public final int type;
    property public final long uptimeMillis;
  }

  public final class PointerInputEventProcessorKt {
  }

  public abstract class PointerInputFilter {
    ctor public PointerInputFilter();
    method public boolean getInterceptOutOfBoundsChildEvents();
    method public final long getSize();
    method public abstract void onCancel();
    method public abstract void onPointerEvent(androidx.compose.ui.input.pointer.PointerEvent pointerEvent, androidx.compose.ui.input.pointer.PointerEventPass pass, long bounds);
    property public boolean interceptOutOfBoundsChildEvents;
    property public final long size;
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface PointerInputModifier extends androidx.compose.ui.Modifier.Element {
    method public androidx.compose.ui.input.pointer.PointerInputFilter getPointerInputFilter();
    property public abstract androidx.compose.ui.input.pointer.PointerInputFilter pointerInputFilter;
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface PointerInputScope extends androidx.compose.ui.unit.Density {
    method public suspend <R> Object? awaitPointerEventScope(kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.AwaitPointerEventScope,? super kotlin.coroutines.Continuation<? super R>,?> block, kotlin.coroutines.Continuation<? super R>);
    method public default long getExtendedTouchPadding();
    method public default boolean getInterceptOutOfBoundsChildEvents();
    method public long getSize();
    method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
    method public default void setInterceptOutOfBoundsChildEvents(boolean);
    property public default long extendedTouchPadding;
    property public default boolean interceptOutOfBoundsChildEvents;
    property public abstract long size;
    property public abstract androidx.compose.ui.platform.ViewConfiguration viewConfiguration;
  }

  public final class PointerInputTestUtilKt {
  }

  public final class PointerInteropFilter_androidKt {
  }

  public final class PointerInteropUtils_androidKt {
  }

  @kotlin.jvm.JvmInline public final value class PointerKeyboardModifiers {
    ctor public PointerKeyboardModifiers(int packedValue);
  }

  @kotlin.jvm.JvmInline public final value class PointerType {
    field public static final androidx.compose.ui.input.pointer.PointerType.Companion Companion;
  }

  public static final class PointerType.Companion {
    method public int getEraser();
    method public int getMouse();
    method public int getStylus();
    method public int getTouch();
    method public int getUnknown();
    property public final int Eraser;
    property public final int Mouse;
    property public final int Stylus;
    property public final int Touch;
    property public final int Unknown;
  }

  public final class SuspendingPointerInputFilterKt {
    method @Deprecated public static androidx.compose.ui.Modifier pointerInput(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
    method public static androidx.compose.ui.Modifier pointerInput(androidx.compose.ui.Modifier, Object? key1, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
    method public static androidx.compose.ui.Modifier pointerInput(androidx.compose.ui.Modifier, Object? key1, Object? key2, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
    method public static androidx.compose.ui.Modifier pointerInput(androidx.compose.ui.Modifier, Object![]? keys, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
  }

}

package androidx.compose.ui.input.pointer.util {

  public final class VelocityTracker {
    ctor public VelocityTracker();
    method public void addPosition(long timeMillis, long position);
    method public long calculateVelocity();
    method public void resetTracking();
  }

  public final class VelocityTrackerKt {
    method public static void addPointerInputChange(androidx.compose.ui.input.pointer.util.VelocityTracker, androidx.compose.ui.input.pointer.PointerInputChange event);
  }

}

package androidx.compose.ui.input.rotary {

  public final class RotaryInputModifierKt {
  }

}

package androidx.compose.ui.internal {

  public final class JvmDefaultWithCompatibility_jvmKt {
  }

}

package androidx.compose.ui.layout {

  @androidx.compose.runtime.Immutable public abstract sealed class AlignmentLine {
    field public static final androidx.compose.ui.layout.AlignmentLine.Companion Companion;
    field public static final int Unspecified = -2147483648; // 0x80000000
  }

  public static final class AlignmentLine.Companion {
  }

  public final class AlignmentLineKt {
    method public static androidx.compose.ui.layout.HorizontalAlignmentLine getFirstBaseline();
    method public static androidx.compose.ui.layout.HorizontalAlignmentLine getLastBaseline();
    property public static final androidx.compose.ui.layout.HorizontalAlignmentLine FirstBaseline;
    property public static final androidx.compose.ui.layout.HorizontalAlignmentLine LastBaseline;
  }

  public interface BeyondBoundsLayout {
    method public <T> T? layout(int direction, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.BeyondBoundsLayout.BeyondBoundsScope,? extends T> block);
  }

  public static interface BeyondBoundsLayout.BeyondBoundsScope {
    method public boolean getHasMoreContent();
    property public abstract boolean hasMoreContent;
  }

  @kotlin.jvm.JvmInline public static final value class BeyondBoundsLayout.LayoutDirection {
    field public static final androidx.compose.ui.layout.BeyondBoundsLayout.LayoutDirection.Companion Companion;
  }

  public static final class BeyondBoundsLayout.LayoutDirection.Companion {
    method public int getAbove();
    method public int getAfter();
    method public int getBefore();
    method public int getBelow();
    method public int getLeft();
    method public int getRight();
    property public final int Above;
    property public final int After;
    property public final int Before;
    property public final int Below;
    property public final int Left;
    property public final int Right;
  }

  public final class BeyondBoundsLayoutKt {
    method public static androidx.compose.ui.modifier.ProvidableModifierLocal<androidx.compose.ui.layout.BeyondBoundsLayout> getModifierLocalBeyondBoundsLayout();
    property public static final androidx.compose.ui.modifier.ProvidableModifierLocal<androidx.compose.ui.layout.BeyondBoundsLayout> ModifierLocalBeyondBoundsLayout;
  }

  @androidx.compose.runtime.Stable public interface ContentScale {
    method public long computeScaleFactor(long srcSize, long dstSize);
    field public static final androidx.compose.ui.layout.ContentScale.Companion Companion;
  }

  public static final class ContentScale.Companion {
    method public androidx.compose.ui.layout.ContentScale getCrop();
    method public androidx.compose.ui.layout.ContentScale getFillBounds();
    method public androidx.compose.ui.layout.ContentScale getFillHeight();
    method public androidx.compose.ui.layout.ContentScale getFillWidth();
    method public androidx.compose.ui.layout.ContentScale getFit();
    method public androidx.compose.ui.layout.ContentScale getInside();
    method public androidx.compose.ui.layout.FixedScale getNone();
    property public final androidx.compose.ui.layout.ContentScale Crop;
    property public final androidx.compose.ui.layout.ContentScale FillBounds;
    property public final androidx.compose.ui.layout.ContentScale FillHeight;
    property public final androidx.compose.ui.layout.ContentScale FillWidth;
    property public final androidx.compose.ui.layout.ContentScale Fit;
    property public final androidx.compose.ui.layout.ContentScale Inside;
    property public final androidx.compose.ui.layout.FixedScale None;
  }

  public final class ContentScaleKt {
  }

  @androidx.compose.runtime.Immutable public final class FixedScale implements androidx.compose.ui.layout.ContentScale {
    ctor public FixedScale(float value);
    method public float component1();
    method public long computeScaleFactor(long srcSize, long dstSize);
    method public androidx.compose.ui.layout.FixedScale copy(float value);
    method public float getValue();
    property public final float value;
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface GraphicLayerInfo {
    method public long getLayerId();
    method public default long getOwnerViewId();
    property public abstract long layerId;
    property public default long ownerViewId;
  }

  public final class HorizontalAlignmentLine extends androidx.compose.ui.layout.AlignmentLine {
    ctor public HorizontalAlignmentLine(kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Integer,java.lang.Integer> merger);
  }

  public interface IntrinsicMeasurable {
    method public Object? getParentData();
    method public int maxIntrinsicHeight(int width);
    method public int maxIntrinsicWidth(int height);
    method public int minIntrinsicHeight(int width);
    method public int minIntrinsicWidth(int height);
    property public abstract Object? parentData;
  }

  public interface IntrinsicMeasureScope extends androidx.compose.ui.unit.Density {
    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
    property public abstract androidx.compose.ui.unit.LayoutDirection layoutDirection;
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface LayoutCoordinates {
    method public operator int get(androidx.compose.ui.layout.AlignmentLine alignmentLine);
    method public androidx.compose.ui.layout.LayoutCoordinates? getParentCoordinates();
    method public androidx.compose.ui.layout.LayoutCoordinates? getParentLayoutCoordinates();
    method public java.util.Set<androidx.compose.ui.layout.AlignmentLine> getProvidedAlignmentLines();
    method public long getSize();
    method public boolean isAttached();
    method public androidx.compose.ui.geometry.Rect localBoundingBoxOf(androidx.compose.ui.layout.LayoutCoordinates sourceCoordinates, optional boolean clipBounds);
    method public long localPositionOf(androidx.compose.ui.layout.LayoutCoordinates sourceCoordinates, long relativeToSource);
    method public long localToRoot(long relativeToLocal);
    method public long localToWindow(long relativeToLocal);
    method public default void transformFrom(androidx.compose.ui.layout.LayoutCoordinates sourceCoordinates, float[] matrix);
    method public long windowToLocal(long relativeToWindow);
    property public abstract boolean isAttached;
    property public abstract androidx.compose.ui.layout.LayoutCoordinates? parentCoordinates;
    property public abstract androidx.compose.ui.layout.LayoutCoordinates? parentLayoutCoordinates;
    property public abstract java.util.Set<androidx.compose.ui.layout.AlignmentLine> providedAlignmentLines;
    property public abstract long size;
  }

  public final class LayoutCoordinatesKt {
    method public static androidx.compose.ui.geometry.Rect boundsInParent(androidx.compose.ui.layout.LayoutCoordinates);
    method public static androidx.compose.ui.geometry.Rect boundsInRoot(androidx.compose.ui.layout.LayoutCoordinates);
    method public static androidx.compose.ui.geometry.Rect boundsInWindow(androidx.compose.ui.layout.LayoutCoordinates);
    method public static androidx.compose.ui.layout.LayoutCoordinates findRootCoordinates(androidx.compose.ui.layout.LayoutCoordinates);
    method public static long positionInParent(androidx.compose.ui.layout.LayoutCoordinates);
    method public static long positionInRoot(androidx.compose.ui.layout.LayoutCoordinates);
    method public static long positionInWindow(androidx.compose.ui.layout.LayoutCoordinates);
  }

  public final class LayoutIdKt {
    method public static Object? getLayoutId(androidx.compose.ui.layout.Measurable);
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier layoutId(androidx.compose.ui.Modifier, Object layoutId);
  }

  public interface LayoutIdParentData {
    method public Object getLayoutId();
    property public abstract Object layoutId;
  }

  public interface LayoutInfo {
    method public androidx.compose.ui.layout.LayoutCoordinates getCoordinates();
    method public androidx.compose.ui.unit.Density getDensity();
    method public int getHeight();
    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
    method public java.util.List<androidx.compose.ui.layout.ModifierInfo> getModifierInfo();
    method public androidx.compose.ui.layout.LayoutInfo? getParentInfo();
    method public int getSemanticsId();
    method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
    method public int getWidth();
    method public boolean isAttached();
    method public boolean isPlaced();
    property public abstract androidx.compose.ui.layout.LayoutCoordinates coordinates;
    property public abstract androidx.compose.ui.unit.Density density;
    property public abstract int height;
    property public abstract boolean isAttached;
    property public abstract boolean isPlaced;
    property public abstract androidx.compose.ui.unit.LayoutDirection layoutDirection;
    property public abstract androidx.compose.ui.layout.LayoutInfo? parentInfo;
    property public abstract int semanticsId;
    property public abstract androidx.compose.ui.platform.ViewConfiguration viewConfiguration;
    property public abstract int width;
  }

  public final class LayoutKt {
    method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static inline void Layout(kotlin.jvm.functions.Function0<kotlin.Unit> content, optional androidx.compose.ui.Modifier modifier, androidx.compose.ui.layout.MeasurePolicy measurePolicy);
    method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static inline void Layout(optional androidx.compose.ui.Modifier modifier, androidx.compose.ui.layout.MeasurePolicy measurePolicy);
    method @Deprecated @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static void MultiMeasureLayout(optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function0<kotlin.Unit> content, androidx.compose.ui.layout.MeasurePolicy measurePolicy);
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface LayoutModifier extends androidx.compose.ui.Modifier.Element {
    method public default int maxIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, androidx.compose.ui.layout.IntrinsicMeasurable measurable, int width);
    method public default int maxIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope, androidx.compose.ui.layout.IntrinsicMeasurable measurable, int height);
    method public androidx.compose.ui.layout.MeasureResult measure(androidx.compose.ui.layout.MeasureScope, androidx.compose.ui.layout.Measurable measurable, long constraints);
    method public default int minIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, androidx.compose.ui.layout.IntrinsicMeasurable measurable, int width);
    method public default int minIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope, androidx.compose.ui.layout.IntrinsicMeasurable measurable, int height);
  }

  public final class LayoutModifierKt {
    method public static androidx.compose.ui.Modifier layout(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function3<? super androidx.compose.ui.layout.MeasureScope,? super androidx.compose.ui.layout.Measurable,? super androidx.compose.ui.unit.Constraints,? extends androidx.compose.ui.layout.MeasureResult> measure);
  }

  public final class LookaheadLayoutCoordinatesKt {
  }

  public final class LookaheadLayoutKt {
  }

  public interface Measurable extends androidx.compose.ui.layout.IntrinsicMeasurable {
    method public androidx.compose.ui.layout.Placeable measure(long constraints);
  }

  @androidx.compose.runtime.Stable @kotlin.jvm.JvmDefaultWithCompatibility public fun interface MeasurePolicy {
    method public default int maxIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable> measurables, int width);
    method public default int maxIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable> measurables, int height);
    method public androidx.compose.ui.layout.MeasureResult measure(androidx.compose.ui.layout.MeasureScope, java.util.List<? extends androidx.compose.ui.layout.Measurable> measurables, long constraints);
    method public default int minIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable> measurables, int width);
    method public default int minIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable> measurables, int height);
  }

  public interface MeasureResult {
    method public java.util.Map<androidx.compose.ui.layout.AlignmentLine,java.lang.Integer> getAlignmentLines();
    method public int getHeight();
    method public int getWidth();
    method public void placeChildren();
    property public abstract java.util.Map<androidx.compose.ui.layout.AlignmentLine,java.lang.Integer> alignmentLines;
    property public abstract int height;
    property public abstract int width;
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface MeasureScope extends androidx.compose.ui.layout.IntrinsicMeasureScope {
    method public default androidx.compose.ui.layout.MeasureResult layout(int width, int height, optional java.util.Map<androidx.compose.ui.layout.AlignmentLine,java.lang.Integer> alignmentLines, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.Placeable.PlacementScope,kotlin.Unit> placementBlock);
  }

  public interface Measured {
    method public operator int get(androidx.compose.ui.layout.AlignmentLine alignmentLine);
    method public int getMeasuredHeight();
    method public int getMeasuredWidth();
    method public default Object? getParentData();
    property public abstract int measuredHeight;
    property public abstract int measuredWidth;
    property public default Object? parentData;
  }

  public final class ModifierInfo {
    ctor public ModifierInfo(androidx.compose.ui.Modifier modifier, androidx.compose.ui.layout.LayoutCoordinates coordinates, optional Object? extra);
    method public androidx.compose.ui.layout.LayoutCoordinates getCoordinates();
    method public Object? getExtra();
    method public androidx.compose.ui.Modifier getModifier();
    property public final androidx.compose.ui.layout.LayoutCoordinates coordinates;
    property public final Object? extra;
    property public final androidx.compose.ui.Modifier modifier;
  }

  public final class MultiContentMeasurePolicyKt {
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface OnGloballyPositionedModifier extends androidx.compose.ui.Modifier.Element {
    method public void onGloballyPositioned(androidx.compose.ui.layout.LayoutCoordinates coordinates);
  }

  public final class OnGloballyPositionedModifierKt {
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier onGloballyPositioned(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.LayoutCoordinates,kotlin.Unit> onGloballyPositioned);
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface OnPlacedModifier extends androidx.compose.ui.Modifier.Element {
    method public void onPlaced(androidx.compose.ui.layout.LayoutCoordinates coordinates);
  }

  public final class OnPlacedModifierKt {
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier onPlaced(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.LayoutCoordinates,kotlin.Unit> onPlaced);
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface OnRemeasuredModifier extends androidx.compose.ui.Modifier.Element {
    method public void onRemeasured(long size);
  }

  public final class OnRemeasuredModifierKt {
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier onSizeChanged(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,kotlin.Unit> onSizeChanged);
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface ParentDataModifier extends androidx.compose.ui.Modifier.Element {
    method public Object? modifyParentData(androidx.compose.ui.unit.Density, Object? parentData);
  }

  public abstract class Placeable implements androidx.compose.ui.layout.Measured {
    ctor public Placeable();
    method protected final long getApparentToRealOffset();
    method public final int getHeight();
    method public int getMeasuredHeight();
    method protected final long getMeasuredSize();
    method public int getMeasuredWidth();
    method protected final long getMeasurementConstraints();
    method public final int getWidth();
    method protected abstract void placeAt(long position, float zIndex, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit>? layerBlock);
    method protected final void setMeasuredSize(long);
    method protected final void setMeasurementConstraints(long);
    property protected final long apparentToRealOffset;
    property public final int height;
    property public int measuredHeight;
    property protected final long measuredSize;
    property public int measuredWidth;
    property protected final long measurementConstraints;
    property public final int width;
  }

  public abstract static class Placeable.PlacementScope {
    ctor public Placeable.PlacementScope();
    method protected abstract androidx.compose.ui.unit.LayoutDirection getParentLayoutDirection();
    method protected abstract int getParentWidth();
    method public final void place(androidx.compose.ui.layout.Placeable, int x, int y, optional float zIndex);
    method public final void place(androidx.compose.ui.layout.Placeable, long position, optional float zIndex);
    method public final void placeRelative(androidx.compose.ui.layout.Placeable, long position, optional float zIndex);
    method public final void placeRelative(androidx.compose.ui.layout.Placeable, int x, int y, optional float zIndex);
    method public final void placeRelativeWithLayer(androidx.compose.ui.layout.Placeable, long position, optional float zIndex, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> layerBlock);
    method public final void placeRelativeWithLayer(androidx.compose.ui.layout.Placeable, int x, int y, optional float zIndex, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> layerBlock);
    method public final void placeWithLayer(androidx.compose.ui.layout.Placeable, int x, int y, optional float zIndex, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> layerBlock);
    method public final void placeWithLayer(androidx.compose.ui.layout.Placeable, long position, optional float zIndex, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> layerBlock);
    property protected abstract androidx.compose.ui.unit.LayoutDirection parentLayoutDirection;
    property protected abstract int parentWidth;
  }

  public final class PlaceableKt {
  }

  public final class RelocationModifierKt {
  }

  public final class RelocationRequesterModifierKt {
  }

  public interface Remeasurement {
    method public void forceRemeasure();
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface RemeasurementModifier extends androidx.compose.ui.Modifier.Element {
    method public void onRemeasurementAvailable(androidx.compose.ui.layout.Remeasurement remeasurement);
  }

  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class ScaleFactor {
    method @androidx.compose.runtime.Stable public inline operator float component1();
    method @androidx.compose.runtime.Stable public inline operator float component2();
    method public long copy(optional float scaleX, optional float scaleY);
    method @androidx.compose.runtime.Stable public operator long div(float operand);
    method public float getScaleX();
    method public float getScaleY();
    method @androidx.compose.runtime.Stable public operator long times(float operand);
    property public final float scaleX;
    property public final float scaleY;
    field public static final androidx.compose.ui.layout.ScaleFactor.Companion Companion;
  }

  public static final class ScaleFactor.Companion {
    method public long getUnspecified();
    property public final long Unspecified;
  }

  public final class ScaleFactorKt {
    method @androidx.compose.runtime.Stable public static long ScaleFactor(float scaleX, float scaleY);
    method @androidx.compose.runtime.Stable public static operator long div(long, long scaleFactor);
    method public static inline boolean isSpecified(long);
    method public static inline boolean isUnspecified(long);
    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
    method public static inline long takeOrElse(long, kotlin.jvm.functions.Function0<androidx.compose.ui.layout.ScaleFactor> block);
    method @androidx.compose.runtime.Stable public static operator long times(long, long scaleFactor);
    method @androidx.compose.runtime.Stable public static operator long times(long, long size);
  }

  public final class SubcomposeLayoutKt {
    method @androidx.compose.runtime.Composable public static void SubcomposeLayout(optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function2<? super androidx.compose.ui.layout.SubcomposeMeasureScope,? super androidx.compose.ui.unit.Constraints,? extends androidx.compose.ui.layout.MeasureResult> measurePolicy);
    method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static void SubcomposeLayout(androidx.compose.ui.layout.SubcomposeLayoutState state, optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function2<? super androidx.compose.ui.layout.SubcomposeMeasureScope,? super androidx.compose.ui.unit.Constraints,? extends androidx.compose.ui.layout.MeasureResult> measurePolicy);
    method public static androidx.compose.ui.layout.SubcomposeSlotReusePolicy SubcomposeSlotReusePolicy(int maxSlotsToRetainForReuse);
  }

  public final class SubcomposeLayoutState {
    ctor public SubcomposeLayoutState(androidx.compose.ui.layout.SubcomposeSlotReusePolicy slotReusePolicy);
    ctor public SubcomposeLayoutState();
    ctor @Deprecated public SubcomposeLayoutState(int maxSlotsToRetainForReuse);
    method public androidx.compose.ui.layout.SubcomposeLayoutState.PrecomposedSlotHandle precompose(Object? slotId, kotlin.jvm.functions.Function0<kotlin.Unit> content);
  }

  public static interface SubcomposeLayoutState.PrecomposedSlotHandle {
    method public void dispose();
    method public default int getPlaceablesCount();
    method public default void premeasure(int index, long constraints);
    property public default int placeablesCount;
  }

  public interface SubcomposeMeasureScope extends androidx.compose.ui.layout.MeasureScope {
    method public java.util.List<androidx.compose.ui.layout.Measurable> subcompose(Object? slotId, kotlin.jvm.functions.Function0<kotlin.Unit> content);
  }

  public interface SubcomposeSlotReusePolicy {
    method public boolean areCompatible(Object? slotId, Object? reusableSlotId);
    method public void getSlotsToRetain(androidx.compose.ui.layout.SubcomposeSlotReusePolicy.SlotIdsSet slotIds);
  }

  public static final class SubcomposeSlotReusePolicy.SlotIdsSet implements java.util.Collection<java.lang.Object> kotlin.jvm.internal.markers.KMappedMarker {
    method public void clear();
    method public java.util.Iterator<java.lang.Object> iterator();
    method public boolean remove(Object? slotId);
    method public boolean removeAll(java.util.Collection<?> slotIds);
    method public boolean removeAll(kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Boolean> predicate);
    method public boolean retainAll(java.util.Collection<?> slotIds);
    method public boolean retainAll(kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Boolean> predicate);
  }

  public final class TestModifierUpdaterKt {
  }

  public final class VerticalAlignmentLine extends androidx.compose.ui.layout.AlignmentLine {
    ctor public VerticalAlignmentLine(kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Integer,java.lang.Integer> merger);
  }

}

package androidx.compose.ui.modifier {

  @androidx.compose.runtime.Stable public abstract sealed class ModifierLocal<T> {
  }

  @androidx.compose.runtime.Stable @kotlin.jvm.JvmDefaultWithCompatibility public interface ModifierLocalConsumer extends androidx.compose.ui.Modifier.Element {
    method public void onModifierLocalsUpdated(androidx.compose.ui.modifier.ModifierLocalReadScope scope);
  }

  public final class ModifierLocalConsumerKt {
  }

  public final class ModifierLocalKt {
    method public static <T> androidx.compose.ui.modifier.ProvidableModifierLocal<T> modifierLocalOf(kotlin.jvm.functions.Function0<? extends T> defaultFactory);
  }

  public final class ModifierLocalNodeKt {
  }

  @androidx.compose.runtime.Stable @kotlin.jvm.JvmDefaultWithCompatibility public interface ModifierLocalProvider<T> extends androidx.compose.ui.Modifier.Element {
    method public androidx.compose.ui.modifier.ProvidableModifierLocal<T> getKey();
    method public T! getValue();
    property public abstract androidx.compose.ui.modifier.ProvidableModifierLocal<T> key;
    property public abstract T! value;
  }

  public final class ModifierLocalProviderKt {
  }

  public interface ModifierLocalReadScope {
    method public <T> T! getCurrent(androidx.compose.ui.modifier.ModifierLocal<T>);
  }

  @androidx.compose.runtime.Stable public final class ProvidableModifierLocal<T> extends androidx.compose.ui.modifier.ModifierLocal<T> {
    ctor public ProvidableModifierLocal(kotlin.jvm.functions.Function0<? extends T> defaultFactory);
  }

}

package androidx.compose.ui.node {

  public final class BackwardsCompatNodeKt {
  }

  public final class DelegatableNodeKt {
  }

  public final class DrawModifierNodeKt {
  }

  public final class HitTestResultKt {
  }

  public final class LayoutModifierNodeCoordinatorKt {
  }

  public final class LayoutModifierNodeKt {
  }

  public final class LayoutNodeDrawScopeKt {
  }

  public final class LayoutNodeKt {
  }

  public final class LayoutNodeLayoutDelegateKt {
  }

  public final class MeasureScopeWithLayoutNodeKt {
  }

  public final class ModifierNodeElementKt {
  }

  public final class MyersDiffKt {
  }

  public final class NodeChainKt {
  }

  public final class NodeCoordinatorKt {
  }

  public final class NodeKindKt {
  }

  public final class PointerInputModifierNodeKt {
  }

  public final class Ref<T> {
    ctor public Ref();
    method public T? getValue();
    method public void setValue(T?);
    property public final T? value;
  }

  public interface RootForTest {
    method public androidx.compose.ui.unit.Density getDensity();
    method public androidx.compose.ui.semantics.SemanticsOwner getSemanticsOwner();
    method public androidx.compose.ui.text.input.TextInputService getTextInputService();
    method public boolean sendKeyEvent(android.view.KeyEvent keyEvent);
    property public abstract androidx.compose.ui.unit.Density density;
    property public abstract androidx.compose.ui.semantics.SemanticsOwner semanticsOwner;
    property public abstract androidx.compose.ui.text.input.TextInputService textInputService;
  }

  public final class SemanticsModifierNodeKt {
  }

  public final class ViewInterop_androidKt {
  }

}

package androidx.compose.ui.platform {

  public abstract class AbstractComposeView extends android.view.ViewGroup {
    ctor public AbstractComposeView(android.content.Context context, optional android.util.AttributeSet? attrs, optional int defStyleAttr);
    ctor public AbstractComposeView(android.content.Context context, optional android.util.AttributeSet? attrs);
    ctor public AbstractComposeView(android.content.Context context);
    method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public abstract void Content();
    method public final void createComposition();
    method public final void disposeComposition();
    method public final boolean getHasComposition();
    method protected boolean getShouldCreateCompositionOnAttachedToWindow();
    method public final boolean getShowLayoutBounds();
    method protected final void onLayout(boolean changed, int left, int top, int right, int bottom);
    method protected final void onMeasure(int widthMeasureSpec, int heightMeasureSpec);
    method public final void setParentCompositionContext(androidx.compose.runtime.CompositionContext? parent);
    method public final void setShowLayoutBounds(boolean);
    method public final void setViewCompositionStrategy(androidx.compose.ui.platform.ViewCompositionStrategy strategy);
    property public final boolean hasComposition;
    property protected boolean shouldCreateCompositionOnAttachedToWindow;
    property public final boolean showLayoutBounds;
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface AccessibilityManager {
    method public long calculateRecommendedTimeoutMillis(long originalTimeoutMillis, optional boolean containsIcons, optional boolean containsText, optional boolean containsControls);
  }

  public final class AndroidClipboardManager_androidKt {
  }

  public final class AndroidComposeViewAccessibilityDelegateCompat_androidKt {
  }

  public final class AndroidComposeView_androidKt {
  }

  public final class AndroidCompositionLocals_androidKt {
    method public static androidx.compose.runtime.ProvidableCompositionLocal<android.content.res.Configuration> getLocalConfiguration();
    method public static androidx.compose.runtime.ProvidableCompositionLocal<android.content.Context> getLocalContext();
    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.lifecycle.LifecycleOwner> getLocalLifecycleOwner();
    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.savedstate.SavedStateRegistryOwner> getLocalSavedStateRegistryOwner();
    method public static androidx.compose.runtime.ProvidableCompositionLocal<android.view.View> getLocalView();
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<android.content.res.Configuration> LocalConfiguration;
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<android.content.Context> LocalContext;
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.lifecycle.LifecycleOwner> LocalLifecycleOwner;
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.savedstate.SavedStateRegistryOwner> LocalSavedStateRegistryOwner;
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<android.view.View> LocalView;
  }

  public final class AndroidUiDispatcher extends kotlinx.coroutines.CoroutineDispatcher {
    method public void dispatch(kotlin.coroutines.CoroutineContext context, Runnable block);
    method public android.view.Choreographer getChoreographer();
    method public androidx.compose.runtime.MonotonicFrameClock getFrameClock();
    property public final android.view.Choreographer choreographer;
    property public final androidx.compose.runtime.MonotonicFrameClock frameClock;
    field public static final androidx.compose.ui.platform.AndroidUiDispatcher.Companion Companion;
  }

  public static final class AndroidUiDispatcher.Companion {
    method public kotlin.coroutines.CoroutineContext getCurrentThread();
    method public kotlin.coroutines.CoroutineContext getMain();
    property public final kotlin.coroutines.CoroutineContext CurrentThread;
    property public final kotlin.coroutines.CoroutineContext Main;
  }

  public final class AndroidUiDispatcher_androidKt {
  }

  public final class AndroidUiFrameClock implements androidx.compose.runtime.MonotonicFrameClock {
    ctor public AndroidUiFrameClock(android.view.Choreographer choreographer);
    method public android.view.Choreographer getChoreographer();
    method public suspend <R> Object? withFrameNanos(kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R>);
    property public final android.view.Choreographer choreographer;
  }

  public final class AndroidUriHandler implements androidx.compose.ui.platform.UriHandler {
    ctor public AndroidUriHandler(android.content.Context context);
    method public void openUri(String uri);
  }

  public final class AndroidViewConfiguration implements androidx.compose.ui.platform.ViewConfiguration {
    ctor public AndroidViewConfiguration(android.view.ViewConfiguration viewConfiguration);
    method public long getDoubleTapMinTimeMillis();
    method public long getDoubleTapTimeoutMillis();
    method public long getLongPressTimeoutMillis();
    method public float getTouchSlop();
    property public long doubleTapMinTimeMillis;
    property public long doubleTapTimeoutMillis;
    property public long longPressTimeoutMillis;
    property public float touchSlop;
  }

  public interface ClipboardManager {
    method public androidx.compose.ui.text.AnnotatedString? getText();
    method public void setText(androidx.compose.ui.text.AnnotatedString annotatedString);
  }

  public final class ComposeView extends androidx.compose.ui.platform.AbstractComposeView {
    ctor public ComposeView(android.content.Context context, optional android.util.AttributeSet? attrs, optional int defStyleAttr);
    ctor public ComposeView(android.content.Context context, optional android.util.AttributeSet? attrs);
    ctor public ComposeView(android.content.Context context);
    method @androidx.compose.runtime.Composable public void Content();
    method public void setContent(kotlin.jvm.functions.Function0<kotlin.Unit> content);
    property protected boolean shouldCreateCompositionOnAttachedToWindow;
  }

  public final class CompositionLocalsKt {
    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.AccessibilityManager> getLocalAccessibilityManager();
    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ClipboardManager> getLocalClipboardManager();
    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Density> getLocalDensity();
    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.focus.FocusManager> getLocalFocusManager();
    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.font.FontFamily.Resolver> getLocalFontFamilyResolver();
    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.hapticfeedback.HapticFeedback> getLocalHapticFeedback();
    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.input.InputModeManager> getLocalInputModeManager();
    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.LayoutDirection> getLocalLayoutDirection();
    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.input.TextInputService> getLocalTextInputService();
    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.TextToolbar> getLocalTextToolbar();
    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.UriHandler> getLocalUriHandler();
    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ViewConfiguration> getLocalViewConfiguration();
    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.WindowInfo> getLocalWindowInfo();
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.AccessibilityManager> LocalAccessibilityManager;
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ClipboardManager> LocalClipboardManager;
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Density> LocalDensity;
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.focus.FocusManager> LocalFocusManager;
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.font.FontFamily.Resolver> LocalFontFamilyResolver;
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.hapticfeedback.HapticFeedback> LocalHapticFeedback;
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.input.InputModeManager> LocalInputModeManager;
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.LayoutDirection> LocalLayoutDirection;
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.input.TextInputService> LocalTextInputService;
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.TextToolbar> LocalTextToolbar;
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.UriHandler> LocalUriHandler;
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ViewConfiguration> LocalViewConfiguration;
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.WindowInfo> LocalWindowInfo;
  }

  public final class DebugUtilsKt {
  }

  public final class DisposableSaveableStateRegistry_androidKt {
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface InfiniteAnimationPolicy extends kotlin.coroutines.CoroutineContext.Element {
    method public default kotlin.coroutines.CoroutineContext.Key<?> getKey();
    method public suspend <R> Object? onInfiniteOperation(kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super R>,?> block, kotlin.coroutines.Continuation<? super R>);
    property public default kotlin.coroutines.CoroutineContext.Key<?> key;
    field public static final androidx.compose.ui.platform.InfiniteAnimationPolicy.Key Key;
  }

  public static final class InfiniteAnimationPolicy.Key implements kotlin.coroutines.CoroutineContext.Key<androidx.compose.ui.platform.InfiniteAnimationPolicy> {
  }

  public final class InfiniteAnimationPolicyKt {
  }

  public final class InspectableModifier extends androidx.compose.ui.platform.InspectorValueInfo implements androidx.compose.ui.Modifier.Element {
    ctor public InspectableModifier(kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> inspectorInfo);
    method public androidx.compose.ui.platform.InspectableModifier.End getEnd();
    property public final androidx.compose.ui.platform.InspectableModifier.End end;
  }

  public final class InspectableModifier.End implements androidx.compose.ui.Modifier.Element {
    ctor public InspectableModifier.End();
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface InspectableValue {
    method public default kotlin.sequences.Sequence<androidx.compose.ui.platform.ValueElement> getInspectableElements();
    method public default String? getNameFallback();
    method public default Object? getValueOverride();
    property public default kotlin.sequences.Sequence<androidx.compose.ui.platform.ValueElement> inspectableElements;
    property public default String? nameFallback;
    property public default Object? valueOverride;
  }

  public final class InspectableValueKt {
    method public static inline kotlin.jvm.functions.Function1<androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> debugInspectorInfo(kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> definitions);
    method public static kotlin.jvm.functions.Function1<androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> getNoInspectorInfo();
    method public static inline androidx.compose.ui.Modifier inspectable(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> inspectorInfo, kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier,? extends androidx.compose.ui.Modifier> factory);
    method public static boolean isDebugInspectorInfoEnabled();
    method public static void setDebugInspectorInfoEnabled(boolean);
    property public static final kotlin.jvm.functions.Function1<androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> NoInspectorInfo;
    property public static final boolean isDebugInspectorInfoEnabled;
  }

  public final class InspectionModeKt {
    method public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> getLocalInspectionMode();
    property public static final androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> LocalInspectionMode;
  }

  public final class InspectorInfo {
    ctor public InspectorInfo();
    method public String? getName();
    method public androidx.compose.ui.platform.ValueElementSequence getProperties();
    method public Object? getValue();
    method public void setName(String?);
    method public void setValue(Object?);
    property public final String? name;
    property public final androidx.compose.ui.platform.ValueElementSequence properties;
    property public final Object? value;
  }

  public abstract class InspectorValueInfo implements androidx.compose.ui.platform.InspectableValue {
    ctor public InspectorValueInfo(kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> info);
    property public kotlin.sequences.Sequence<androidx.compose.ui.platform.ValueElement> inspectableElements;
    property public String? nameFallback;
    property public Object? valueOverride;
  }

  public final class InvertMatrixKt {
  }

  public final class JvmActuals_jvmKt {
  }

  public final class NestedScrollInteropConnectionKt {
  }

  public final class ShapeContainingUtilKt {
  }

  public final class TestTagKt {
    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier testTag(androidx.compose.ui.Modifier, String tag);
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface TextToolbar {
    method public androidx.compose.ui.platform.TextToolbarStatus getStatus();
    method public void hide();
    method public void showMenu(androidx.compose.ui.geometry.Rect rect, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onCopyRequested, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onPasteRequested, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onCutRequested, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onSelectAllRequested);
    property public abstract androidx.compose.ui.platform.TextToolbarStatus status;
  }

  public enum TextToolbarStatus {
    method public static androidx.compose.ui.platform.TextToolbarStatus valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.compose.ui.platform.TextToolbarStatus[] values();
    enum_constant public static final androidx.compose.ui.platform.TextToolbarStatus Hidden;
    enum_constant public static final androidx.compose.ui.platform.TextToolbarStatus Shown;
  }

  public interface UriHandler {
    method public void openUri(String uri);
  }

  public final class ValueElement {
    ctor public ValueElement(String name, Object? value);
    method public String component1();
    method public Object? component2();
    method public androidx.compose.ui.platform.ValueElement copy(String name, Object? value);
    method public String getName();
    method public Object? getValue();
    property public final String name;
    property public final Object? value;
  }

  public final class ValueElementSequence implements kotlin.sequences.Sequence<androidx.compose.ui.platform.ValueElement> {
    ctor public ValueElementSequence();
    method public java.util.Iterator<androidx.compose.ui.platform.ValueElement> iterator();
    method public operator void set(String name, Object? value);
  }

  public interface ViewCompositionStrategy {
    method public kotlin.jvm.functions.Function0<kotlin.Unit> installFor(androidx.compose.ui.platform.AbstractComposeView view);
    field public static final androidx.compose.ui.platform.ViewCompositionStrategy.Companion Companion;
  }

  public static final class ViewCompositionStrategy.Companion {
    method public androidx.compose.ui.platform.ViewCompositionStrategy getDefault();
    property public final androidx.compose.ui.platform.ViewCompositionStrategy Default;
  }

  public static final class ViewCompositionStrategy.DisposeOnDetachedFromWindow implements androidx.compose.ui.platform.ViewCompositionStrategy {
    method public kotlin.jvm.functions.Function0<kotlin.Unit> installFor(androidx.compose.ui.platform.AbstractComposeView view);
    field public static final androidx.compose.ui.platform.ViewCompositionStrategy.DisposeOnDetachedFromWindow INSTANCE;
  }

  public static final class ViewCompositionStrategy.DisposeOnDetachedFromWindowOrReleasedFromPool implements androidx.compose.ui.platform.ViewCompositionStrategy {
    method public kotlin.jvm.functions.Function0<kotlin.Unit> installFor(androidx.compose.ui.platform.AbstractComposeView view);
    field public static final androidx.compose.ui.platform.ViewCompositionStrategy.DisposeOnDetachedFromWindowOrReleasedFromPool INSTANCE;
  }

  public static final class ViewCompositionStrategy.DisposeOnLifecycleDestroyed implements androidx.compose.ui.platform.ViewCompositionStrategy {
    ctor public ViewCompositionStrategy.DisposeOnLifecycleDestroyed(androidx.lifecycle.Lifecycle lifecycle);
    ctor public ViewCompositionStrategy.DisposeOnLifecycleDestroyed(androidx.lifecycle.LifecycleOwner lifecycleOwner);
    method public kotlin.jvm.functions.Function0<kotlin.Unit> installFor(androidx.compose.ui.platform.AbstractComposeView view);
  }

  public static final class ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed implements androidx.compose.ui.platform.ViewCompositionStrategy {
    method public kotlin.jvm.functions.Function0<kotlin.Unit> installFor(androidx.compose.ui.platform.AbstractComposeView view);
    field public static final androidx.compose.ui.platform.ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed INSTANCE;
  }

  public final class ViewCompositionStrategy_androidKt {
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface ViewConfiguration {
    method public long getDoubleTapMinTimeMillis();
    method public long getDoubleTapTimeoutMillis();
    method public long getLongPressTimeoutMillis();
    method public default long getMinimumTouchTargetSize();
    method public float getTouchSlop();
    property public abstract long doubleTapMinTimeMillis;
    property public abstract long doubleTapTimeoutMillis;
    property public abstract long longPressTimeoutMillis;
    property public default long minimumTouchTargetSize;
    property public abstract float touchSlop;
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface ViewRootForInspector {
    method public default androidx.compose.ui.platform.AbstractComposeView? getSubCompositionView();
    method public default android.view.View? getViewRoot();
    property public default androidx.compose.ui.platform.AbstractComposeView? subCompositionView;
    property public default android.view.View? viewRoot;
  }

  @VisibleForTesting public interface ViewRootForTest extends androidx.compose.ui.node.RootForTest {
    method public boolean getHasPendingMeasureOrLayout();
    method public android.view.View getView();
    method public void invalidateDescendants();
    method public boolean isLifecycleInResumedState();
    property public abstract boolean hasPendingMeasureOrLayout;
    property public abstract boolean isLifecycleInResumedState;
    property public abstract android.view.View view;
    field public static final androidx.compose.ui.platform.ViewRootForTest.Companion Companion;
  }

  public static final class ViewRootForTest.Companion {
    method public kotlin.jvm.functions.Function1<androidx.compose.ui.platform.ViewRootForTest,kotlin.Unit>? getOnViewCreatedCallback();
    method public void setOnViewCreatedCallback(kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.ViewRootForTest,kotlin.Unit>?);
    property public final kotlin.jvm.functions.Function1<androidx.compose.ui.platform.ViewRootForTest,kotlin.Unit>? onViewCreatedCallback;
  }

  @androidx.compose.runtime.Stable public interface WindowInfo {
    method public boolean isWindowFocused();
    property public abstract boolean isWindowFocused;
  }

  public final class WindowInfoKt {
  }

  public final class WindowRecomposer_androidKt {
    method public static androidx.compose.runtime.CompositionContext? findViewTreeCompositionContext(android.view.View);
    method public static androidx.compose.runtime.CompositionContext? getCompositionContext(android.view.View);
    method public static void setCompositionContext(android.view.View, androidx.compose.runtime.CompositionContext?);
  }

  public final class Wrapper_androidKt {
  }

}

package androidx.compose.ui.platform.accessibility {

  public final class CollectionInfoKt {
  }

}

package androidx.compose.ui.res {

  public final class ColorResources_androidKt {
    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static long colorResource(@ColorRes int id);
  }

  public final class FontResources_androidKt {
    method @Deprecated @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static androidx.compose.ui.text.font.Typeface fontResource(androidx.compose.ui.text.font.FontFamily fontFamily);
  }

  public final class ImageResources_androidKt {
    method public static androidx.compose.ui.graphics.ImageBitmap imageResource(androidx.compose.ui.graphics.ImageBitmap.Companion, android.content.res.Resources res, @DrawableRes int id);
    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.ImageBitmap imageResource(androidx.compose.ui.graphics.ImageBitmap.Companion, @DrawableRes int id);
  }

  public final class PainterResources_androidKt {
    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.painter.Painter painterResource(@DrawableRes int id);
  }

  public final class PrimitiveResources_androidKt {
    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static boolean booleanResource(@BoolRes int id);
    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static float dimensionResource(@DimenRes int id);
    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static int[] integerArrayResource(@ArrayRes int id);
    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static int integerResource(@IntegerRes int id);
  }

  public final class Resources_androidKt {
  }

  public final class StringResources_androidKt {
    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static String![] stringArrayResource(@ArrayRes int id);
    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static String stringResource(@StringRes int id);
    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static String stringResource(@StringRes int id, java.lang.Object... formatArgs);
  }

  public final class VectorResources_androidKt {
    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.vector.ImageVector vectorResource(androidx.compose.ui.graphics.vector.ImageVector.Companion, @DrawableRes int id);
    method @kotlin.jvm.Throws(exceptionClasses=XmlPullParserException::class) public static androidx.compose.ui.graphics.vector.ImageVector vectorResource(androidx.compose.ui.graphics.vector.ImageVector.Companion, optional android.content.res.Resources.Theme? theme, android.content.res.Resources res, int resId) throws org.xmlpull.v1.XmlPullParserException;
  }

}

package androidx.compose.ui.semantics {

  public final class AccessibilityAction<T extends kotlin.Function<? extends java.lang.Boolean>> {
    ctor public AccessibilityAction(String? label, T? action);
    method public T? getAction();
    method public String? getLabel();
    property public final T? action;
    property public final String? label;
  }

  public final class CollectionInfo {
    ctor public CollectionInfo(int rowCount, int columnCount);
    method public int getColumnCount();
    method public int getRowCount();
    property public final int columnCount;
    property public final int rowCount;
  }

  public final class CollectionItemInfo {
    ctor public CollectionItemInfo(int rowIndex, int rowSpan, int columnIndex, int columnSpan);
    method public int getColumnIndex();
    method public int getColumnSpan();
    method public int getRowIndex();
    method public int getRowSpan();
    property public final int columnIndex;
    property public final int columnSpan;
    property public final int rowIndex;
    property public final int rowSpan;
  }

  public final class CustomAccessibilityAction {
    ctor public CustomAccessibilityAction(String label, kotlin.jvm.functions.Function0<java.lang.Boolean> action);
    method public kotlin.jvm.functions.Function0<java.lang.Boolean> getAction();
    method public String getLabel();
    property public final kotlin.jvm.functions.Function0<java.lang.Boolean> action;
    property public final String label;
  }

  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class LiveRegionMode {
    field public static final androidx.compose.ui.semantics.LiveRegionMode.Companion Companion;
  }

  public static final class LiveRegionMode.Companion {
    method public int getAssertive();
    method public int getPolite();
    property public final int Assertive;
    property public final int Polite;
  }

  public final class ProgressBarRangeInfo {
    ctor public ProgressBarRangeInfo(float current, kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> range, optional int steps);
    method public float getCurrent();
    method public kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> getRange();
    method public int getSteps();
    property public final float current;
    property public final kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> range;
    property public final int steps;
    field public static final androidx.compose.ui.semantics.ProgressBarRangeInfo.Companion Companion;
  }

  public static final class ProgressBarRangeInfo.Companion {
    method public androidx.compose.ui.semantics.ProgressBarRangeInfo getIndeterminate();
    property public final androidx.compose.ui.semantics.ProgressBarRangeInfo Indeterminate;
  }

  @androidx.compose.runtime.Immutable @kotlin.jvm.JvmInline public final value class Role {
    field public static final androidx.compose.ui.semantics.Role.Companion Companion;
  }

  public static final class Role.Companion {
    method public int getButton();
    method public int getCheckbox();
    method public int getImage();
    method public int getRadioButton();
    method public int getSwitch();
    method public int getTab();
    property public final int Button;
    property public final int Checkbox;
    property public final int Image;
    property public final int RadioButton;
    property public final int Switch;
    property public final int Tab;
  }

  public final class ScrollAxisRange {
    ctor public ScrollAxisRange(kotlin.jvm.functions.Function0<java.lang.Float> value, kotlin.jvm.functions.Function0<java.lang.Float> maxValue, optional boolean reverseScrolling);
    method public kotlin.jvm.functions.Function0<java.lang.Float> getMaxValue();
    method public boolean getReverseScrolling();
    method public kotlin.jvm.functions.Function0<java.lang.Float> getValue();
    property public final kotlin.jvm.functions.Function0<java.lang.Float> maxValue;
    property public final boolean reverseScrolling;
    property public final kotlin.jvm.functions.Function0<java.lang.Float> value;
  }

  public final class SemanticsActions {
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getCollapse();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getCopyText();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction>> getCustomActions();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getCutText();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getDismiss();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getExpand();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.util.List<androidx.compose.ui.text.TextLayoutResult>,java.lang.Boolean>>> getGetTextLayoutResult();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getOnClick();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getOnLongClick();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getPasteText();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getRequestFocus();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Float,java.lang.Boolean>>> getScrollBy();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.lang.Integer,java.lang.Boolean>>> getScrollToIndex();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.lang.Float,java.lang.Boolean>>> getSetProgress();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function3<java.lang.Integer,java.lang.Integer,java.lang.Boolean,java.lang.Boolean>>> getSetSelection();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<androidx.compose.ui.text.AnnotatedString,java.lang.Boolean>>> getSetText();
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> Collapse;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> CopyText;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction>> CustomActions;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> CutText;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> Dismiss;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> Expand;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.util.List<androidx.compose.ui.text.TextLayoutResult>,java.lang.Boolean>>> GetTextLayoutResult;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> OnClick;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> OnLongClick;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> PasteText;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> RequestFocus;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Float,java.lang.Boolean>>> ScrollBy;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.lang.Integer,java.lang.Boolean>>> ScrollToIndex;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.lang.Float,java.lang.Boolean>>> SetProgress;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function3<java.lang.Integer,java.lang.Integer,java.lang.Boolean,java.lang.Boolean>>> SetSelection;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<androidx.compose.ui.text.AnnotatedString,java.lang.Boolean>>> SetText;
    field public static final androidx.compose.ui.semantics.SemanticsActions INSTANCE;
  }

  public final class SemanticsConfiguration implements java.lang.Iterable<java.util.Map.Entry<? extends androidx.compose.ui.semantics.SemanticsPropertyKey<?>,?>> kotlin.jvm.internal.markers.KMappedMarker androidx.compose.ui.semantics.SemanticsPropertyReceiver {
    ctor public SemanticsConfiguration();
    method public operator <T> boolean contains(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key);
    method public androidx.compose.ui.semantics.SemanticsConfiguration copy();
    method public operator <T> T! get(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key);
    method public <T> T! getOrElse(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
    method public <T> T? getOrElseNullable(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
    method public boolean isClearingSemantics();
    method public boolean isMergingSemanticsOfDescendants();
    method public java.util.Iterator<java.util.Map.Entry<androidx.compose.ui.semantics.SemanticsPropertyKey<?>,java.lang.Object>> iterator();
    method public <T> void set(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key, T? value);
    method public void setClearingSemantics(boolean);
    method public void setMergingSemanticsOfDescendants(boolean);
    property public final boolean isClearingSemantics;
    property public final boolean isMergingSemanticsOfDescendants;
  }

  public final class SemanticsConfigurationKt {
    method public static <T> T? getOrNull(androidx.compose.ui.semantics.SemanticsConfiguration, androidx.compose.ui.semantics.SemanticsPropertyKey<T> key);
  }

  @kotlin.jvm.JvmDefaultWithCompatibility public interface SemanticsModifier extends androidx.compose.ui.Modifier.Element {
    method @Deprecated public default int getId();
    method public androidx.compose.ui.semantics.SemanticsConfiguration getSemanticsConfiguration();
    property @Deprecated public default int id;
    property public abstract androidx.compose.ui.semantics.SemanticsConfiguration semanticsConfiguration;
  }

  public final class SemanticsModifierKt {
    method public static androidx.compose.ui.Modifier clearAndSetSemantics(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.semantics.SemanticsPropertyReceiver,kotlin.Unit> properties);
    method public static androidx.compose.ui.Modifier semantics(androidx.compose.ui.Modifier, optional boolean mergeDescendants, kotlin.jvm.functions.Function1<? super androidx.compose.ui.semantics.SemanticsPropertyReceiver,kotlin.Unit> properties);
  }

  public final class SemanticsNode {
    method public int getAlignmentLinePosition(androidx.compose.ui.layout.AlignmentLine alignmentLine);
    method public androidx.compose.ui.geometry.Rect getBoundsInRoot();
    method public androidx.compose.ui.geometry.Rect getBoundsInWindow();
    method public java.util.List<androidx.compose.ui.semantics.SemanticsNode> getChildren();
    method public androidx.compose.ui.semantics.SemanticsConfiguration getConfig();
    method public int getId();
    method public androidx.compose.ui.layout.LayoutInfo getLayoutInfo();
    method public boolean getMergingEnabled();
    method public androidx.compose.ui.semantics.SemanticsNode? getParent();
    method public long getPositionInRoot();
    method public long getPositionInWindow();
    method public androidx.compose.ui.node.RootForTest? getRoot();
    method public long getSize();
    method public androidx.compose.ui.geometry.Rect getTouchBoundsInRoot();
    method public boolean isRoot();
    property public final androidx.compose.ui.geometry.Rect boundsInRoot;
    property public final androidx.compose.ui.geometry.Rect boundsInWindow;
    property public final java.util.List<androidx.compose.ui.semantics.SemanticsNode> children;
    property public final androidx.compose.ui.semantics.SemanticsConfiguration config;
    property public final int id;
    property public final boolean isRoot;
    property public final androidx.compose.ui.layout.LayoutInfo layoutInfo;
    property public final boolean mergingEnabled;
    property public final androidx.compose.ui.semantics.SemanticsNode? parent;
    property public final long positionInRoot;
    property public final long positionInWindow;
    property public final androidx.compose.ui.node.RootForTest? root;
    property public final long size;
    property public final androidx.compose.ui.geometry.Rect touchBoundsInRoot;
  }

  public final class SemanticsNodeKt {
  }

  public final class SemanticsOwner {
    method public androidx.compose.ui.semantics.SemanticsNode getRootSemanticsNode();
    method public androidx.compose.ui.semantics.SemanticsNode getUnmergedRootSemanticsNode();
    property public final androidx.compose.ui.semantics.SemanticsNode rootSemanticsNode;
    property public final androidx.compose.ui.semantics.SemanticsNode unmergedRootSemanticsNode;
  }

  public final class SemanticsOwnerKt {
    method public static java.util.List<androidx.compose.ui.semantics.SemanticsNode> getAllSemanticsNodes(androidx.compose.ui.semantics.SemanticsOwner, boolean mergingEnabled);
  }

  public final class SemanticsProperties {
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionInfo> getCollectionInfo();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionItemInfo> getCollectionItemInfo();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<java.lang.String>> getContentDescription();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getDisabled();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> getEditableText();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getError();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getFocused();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getHeading();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> getHorizontalScrollAxisRange();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.input.ImeAction> getImeAction();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Integer>> getIndexForKey();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getInvisibleToUser();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getIsDialog();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getIsPopup();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.LiveRegionMode> getLiveRegion();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getPaneTitle();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getPassword();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ProgressBarRangeInfo> getProgressBarRangeInfo();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.Role> getRole();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getSelectableGroup();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getSelected();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getStateDescription();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getTestTag();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.text.AnnotatedString>> getText();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.TextRange> getTextSelectionRange();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.state.ToggleableState> getToggleableState();
    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> getVerticalScrollAxisRange();
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionInfo> CollectionInfo;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionItemInfo> CollectionItemInfo;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<java.lang.String>> ContentDescription;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> Disabled;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> EditableText;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> Error;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> Focused;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> Heading;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> HorizontalScrollAxisRange;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.input.ImeAction> ImeAction;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Integer>> IndexForKey;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> InvisibleToUser;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> IsDialog;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> IsPopup;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.LiveRegionMode> LiveRegion;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> PaneTitle;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> Password;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ProgressBarRangeInfo> ProgressBarRangeInfo;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.Role> Role;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> SelectableGroup;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> Selected;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> StateDescription;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> TestTag;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.text.AnnotatedString>> Text;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.TextRange> TextSelectionRange;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.state.ToggleableState> ToggleableState;
    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> VerticalScrollAxisRange;
    field public static final androidx.compose.ui.semantics.SemanticsProperties INSTANCE;
  }

  public final class SemanticsPropertiesKt {
    method public static void collapse(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
    method public static void copyText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
    method public static void cutText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
    method public static void dialog(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static void disabled(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static void dismiss(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
    method public static void error(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String description);
    method public static void expand(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
    method public static androidx.compose.ui.semantics.CollectionInfo getCollectionInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static androidx.compose.ui.semantics.CollectionItemInfo getCollectionItemInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static String getContentDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction> getCustomActions(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static androidx.compose.ui.text.AnnotatedString getEditableText(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static boolean getFocused(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static androidx.compose.ui.semantics.ScrollAxisRange getHorizontalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static int getImeAction(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static int getLiveRegion(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static String getPaneTitle(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static androidx.compose.ui.semantics.ProgressBarRangeInfo getProgressBarRangeInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static int getRole(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static boolean getSelected(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static String getStateDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static String getTestTag(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static androidx.compose.ui.text.AnnotatedString getText(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static void getTextLayoutResult(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function1<? super java.util.List<androidx.compose.ui.text.TextLayoutResult>,java.lang.Boolean>? action);
    method public static long getTextSelectionRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static androidx.compose.ui.state.ToggleableState getToggleableState(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static androidx.compose.ui.semantics.ScrollAxisRange getVerticalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static void heading(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static void indexForKey(androidx.compose.ui.semantics.SemanticsPropertyReceiver, kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Integer> mapping);
    method public static void onClick(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
    method public static void onLongClick(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
    method public static void password(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static void pasteText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
    method public static void popup(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static void requestFocus(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
    method public static void scrollBy(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,java.lang.Boolean>? action);
    method public static void scrollToIndex(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Boolean> action);
    method public static void selectableGroup(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
    method public static void setCollectionInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.CollectionInfo);
    method public static void setCollectionItemInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.CollectionItemInfo);
    method public static void setContentDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String);
    method public static void setCustomActions(androidx.compose.ui.semantics.SemanticsPropertyReceiver, java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction>);
    method public static void setEditableText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString);
    method public static void setFocused(androidx.compose.ui.semantics.SemanticsPropertyReceiver, boolean);
    method public static void setHorizontalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.ScrollAxisRange);
    method public static void setImeAction(androidx.compose.ui.semantics.SemanticsPropertyReceiver, int);
    method public static void setLiveRegion(androidx.compose.ui.semantics.SemanticsPropertyReceiver, int);
    method public static void setPaneTitle(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String);
    method public static void setProgress(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function1<? super java.lang.Float,java.lang.Boolean>? action);
    method public static void setProgressBarRangeInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.ProgressBarRangeInfo);
    method public static void setRole(androidx.compose.ui.semantics.SemanticsPropertyReceiver, int);
    method public static void setSelected(androidx.compose.ui.semantics.SemanticsPropertyReceiver, boolean);
    method public static void setSelection(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function3<? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Boolean,java.lang.Boolean>? action);
    method public static void setStateDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String);
    method public static void setTestTag(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String);
    method public static void setText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString);
    method public static void setText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.AnnotatedString,java.lang.Boolean>? action);
    method public static void setTextSelectionRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver, long);
    method public static void setToggleableState(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.state.ToggleableState);
    method public static void setVerticalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.ScrollAxisRange);
  }

  public final class SemanticsProperties_androidKt {
  }

  public final class SemanticsPropertyKey<T> {
    ctor public SemanticsPropertyKey(String name, optional kotlin.jvm.functions.Function2<? super T,? super T,? extends T> mergePolicy);
    method public String getName();
    method public operator T! getValue(androidx.compose.ui.semantics.SemanticsPropertyReceiver thisRef, kotlin.reflect.KProperty<?> property);
    method public T? merge(T? parentValue, T? childValue);
    method public operator void setValue(androidx.compose.ui.semantics.SemanticsPropertyReceiver thisRef, kotlin.reflect.KProperty<?> property, T? value);
    property public final String name;
  }

  public interface SemanticsPropertyReceiver {
    method public operator <T> void set(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key, T? value);
  }

  public final class SemanticsSortKt {
  }

}

package androidx.compose.ui.state {

  public enum ToggleableState {
    method public static androidx.compose.ui.state.ToggleableState valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.compose.ui.state.ToggleableState[] values();
    enum_constant public static final androidx.compose.ui.state.ToggleableState Indeterminate;
    enum_constant public static final androidx.compose.ui.state.ToggleableState Off;
    enum_constant public static final androidx.compose.ui.state.ToggleableState On;
  }

  public final class ToggleableStateKt {
    method public static androidx.compose.ui.state.ToggleableState ToggleableState(boolean value);
  }

}

package androidx.compose.ui.text {

  public final class TextMeasurerHelperKt {
  }

}

package androidx.compose.ui.text.input {

  public final class CursorAnchorInfoBuilderKt {
  }

  public final class InputState_androidKt {
  }

  public final class RecordingInputConnection_androidKt {
  }

  public final class TextInputServiceAndroid_androidKt {
  }

}

package androidx.compose.ui.viewinterop {

  public final class AndroidViewHolder_androidKt {
  }

  public final class AndroidView_androidKt {
    method @androidx.compose.runtime.Composable @androidx.compose.ui.UiComposable public static <T extends android.view.View> void AndroidView(kotlin.jvm.functions.Function1<? super android.content.Context,? extends T> factory, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super T,kotlin.Unit> update);
    method public static kotlin.jvm.functions.Function1<android.view.View,kotlin.Unit> getNoOpUpdate();
    property public static final kotlin.jvm.functions.Function1<android.view.View,kotlin.Unit> NoOpUpdate;
  }

}

package androidx.compose.ui.window {

  public final class AndroidDialog_androidKt {
    method @androidx.compose.runtime.Composable public static void Dialog(kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, optional androidx.compose.ui.window.DialogProperties properties, kotlin.jvm.functions.Function0<kotlin.Unit> content);
  }

  public final class AndroidPopup_androidKt {
    method @androidx.compose.runtime.Composable public static void Popup(optional androidx.compose.ui.Alignment alignment, optional long offset, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onDismissRequest, optional androidx.compose.ui.window.PopupProperties properties, kotlin.jvm.functions.Function0<kotlin.Unit> content);
    method @androidx.compose.runtime.Composable public static void Popup(androidx.compose.ui.window.PopupPositionProvider popupPositionProvider, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onDismissRequest, optional androidx.compose.ui.window.PopupProperties properties, kotlin.jvm.functions.Function0<kotlin.Unit> content);
    method @org.jetbrains.annotations.TestOnly public static boolean isPopupLayout(android.view.View view, optional String? testTag);
  }

  @androidx.compose.runtime.Immutable public final class DialogProperties {
    ctor public DialogProperties(optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy);
    method public boolean getDismissOnBackPress();
    method public boolean getDismissOnClickOutside();
    method public androidx.compose.ui.window.SecureFlagPolicy getSecurePolicy();
    method public boolean getUsePlatformDefaultWidth();
    property public final boolean dismissOnBackPress;
    property public final boolean dismissOnClickOutside;
    property public final androidx.compose.ui.window.SecureFlagPolicy securePolicy;
    property public final boolean usePlatformDefaultWidth;
  }

  public interface DialogWindowProvider {
    method public android.view.Window getWindow();
    property public abstract android.view.Window window;
  }

  @androidx.compose.runtime.Immutable public interface PopupPositionProvider {
    method public long calculatePosition(androidx.compose.ui.unit.IntRect anchorBounds, long windowSize, androidx.compose.ui.unit.LayoutDirection layoutDirection, long popupContentSize);
  }

  @androidx.compose.runtime.Immutable public final class PopupProperties {
    ctor public PopupProperties(optional boolean focusable, optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy, optional boolean excludeFromSystemGesture, optional boolean clippingEnabled);
    method public boolean getClippingEnabled();
    method public boolean getDismissOnBackPress();
    method public boolean getDismissOnClickOutside();
    method public boolean getExcludeFromSystemGesture();
    method public boolean getFocusable();
    method public androidx.compose.ui.window.SecureFlagPolicy getSecurePolicy();
    method public boolean getUsePlatformDefaultWidth();
    property public final boolean clippingEnabled;
    property public final boolean dismissOnBackPress;
    property public final boolean dismissOnClickOutside;
    property public final boolean excludeFromSystemGesture;
    property public final boolean focusable;
    property public final androidx.compose.ui.window.SecureFlagPolicy securePolicy;
    property public final boolean usePlatformDefaultWidth;
  }

  public enum SecureFlagPolicy {
    method public static androidx.compose.ui.window.SecureFlagPolicy valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.compose.ui.window.SecureFlagPolicy[] values();
    enum_constant public static final androidx.compose.ui.window.SecureFlagPolicy Inherit;
    enum_constant public static final androidx.compose.ui.window.SecureFlagPolicy SecureOff;
    enum_constant public static final androidx.compose.ui.window.SecureFlagPolicy SecureOn;
  }

  public final class SecureFlagPolicy_androidKt {
  }

}

