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

  public final class AdapterListKt {
    method public static <T> void AdapterList(java.util.List<? extends T> data, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> itemCallback);
  }

  public final class Border {
    ctor public Border(androidx.ui.unit.Dp size, androidx.ui.graphics.Brush brush);
    method public androidx.ui.unit.Dp component1();
    method public androidx.ui.graphics.Brush component2();
    method public androidx.ui.foundation.Border copy(androidx.ui.unit.Dp size, androidx.ui.graphics.Brush brush);
    method public androidx.ui.graphics.Brush getBrush();
    method public androidx.ui.unit.Dp getSize();
  }

  public final class BorderKt {
    method public static androidx.ui.foundation.Border Border-YSZAjy0(androidx.ui.unit.Dp size, long color);
  }

  public final class BoxKt {
    method public static void Box-TInkGdk(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.graphics.Shape shape = RectangleShape, long backgroundColor = Color.Transparent, androidx.ui.foundation.Border? border = null, androidx.ui.unit.Dp padding = elvis {
    @null var var41190502: androidx.ui.unit.Dp = border?.size
    if (var41190502 != null) var41190502 else 0.dp
}, androidx.ui.unit.Dp paddingStart = Dp.Unspecified, androidx.ui.unit.Dp paddingTop = Dp.Unspecified, androidx.ui.unit.Dp paddingEnd = Dp.Unspecified, androidx.ui.unit.Dp paddingBottom = Dp.Unspecified, androidx.ui.core.Alignment gravity = ContentGravity.TopStart, kotlin.jvm.functions.Function0<kotlin.Unit> children = emptyContent());
  }

  public final class CanvasKt {
    method public static void Canvas(androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.DrawScope,kotlin.Unit> onCanvas);
  }

  public final class ClickableKt {
    method public static void Clickable(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, boolean enabled = true, String? onClickLabel = null, kotlin.jvm.functions.Function0<kotlin.Unit> children);
  }

  public final class ClickableTextKt {
    method public static void ClickableText(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle style = TextStyle.Default, boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {}, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onClick);
  }

  public final class ColoredRectKt {
    method @Deprecated public static void ColoredRect(androidx.ui.graphics.Brush brush, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null);
    method @Deprecated public static void ColoredRect-rR94L9Y(long color, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null);
  }

  public final class ContentColorKt {
    method public static long contentColor();
    method public static androidx.compose.ProvidableAmbient<androidx.ui.graphics.Color> getContentColorAmbient();
  }

  public final class DarkThemeKt {
    method public static boolean isSystemInDarkTheme();
  }

  public final class DeterminateProgressIndicatorKt {
    method public static void DeterminateProgressIndicator(@FloatRange(from=0.0, to=1.0) float progress, kotlin.jvm.functions.Function0<kotlin.Unit> children);
  }

  public final class DialogKt {
    method public static void Dialog(kotlin.jvm.functions.Function0<kotlin.Unit> onCloseRequest, kotlin.jvm.functions.Function0<kotlin.Unit> children);
  }

  public final class DrawBackground implements androidx.ui.core.DrawModifier {
    method public androidx.ui.foundation.DrawBackground copy(androidx.ui.graphics.Paint paint, androidx.ui.graphics.Shape shape);
    method public void draw(androidx.ui.core.ContentDrawScope);
  }

  public final class DrawBackgroundKt {
    method @Deprecated public static androidx.ui.foundation.DrawBackground DrawBackground(androidx.ui.graphics.Brush brush, androidx.ui.graphics.Shape shape = RectangleShape);
    method @Deprecated public static androidx.ui.foundation.DrawBackground DrawBackground-qSsqlCY(long color, androidx.ui.graphics.Shape shape = RectangleShape);
    method public static androidx.ui.core.Modifier drawBackground(androidx.ui.core.Modifier, androidx.ui.graphics.Paint paint, androidx.ui.graphics.Shape shape);
    method public static androidx.ui.core.Modifier drawBackground(androidx.ui.core.Modifier, androidx.ui.graphics.Brush brush, androidx.ui.graphics.Shape shape = RectangleShape);
    method public static androidx.ui.core.Modifier drawBackground-IZZjS-Q(androidx.ui.core.Modifier, long color, androidx.ui.graphics.Shape shape = RectangleShape);
  }

  public final class DrawBorder implements androidx.ui.core.DrawModifier {
    method public void draw(androidx.ui.core.ContentDrawScope);
  }

  public final class DrawBorderKt {
    method @Deprecated public static androidx.ui.core.Modifier DrawBorder(androidx.ui.foundation.Border border, androidx.ui.graphics.Shape shape = RectangleShape);
    method @Deprecated public static androidx.ui.foundation.DrawBorder DrawBorder(androidx.ui.unit.Dp size, androidx.ui.graphics.Brush brush, androidx.ui.graphics.Shape shape);
    method @Deprecated public static androidx.ui.core.Modifier DrawBorder-Wounw_8(androidx.ui.unit.Dp size, long color, androidx.ui.graphics.Shape shape = RectangleShape);
    method public static androidx.ui.core.Modifier drawBorder(androidx.ui.core.Modifier, androidx.ui.foundation.Border border, androidx.ui.graphics.Shape shape = RectangleShape);
    method public static androidx.ui.core.Modifier drawBorder(androidx.ui.core.Modifier, androidx.ui.unit.Dp size, androidx.ui.graphics.Brush brush, androidx.ui.graphics.Shape shape);
    method public static androidx.ui.core.Modifier drawBorder-ik3FbJE(androidx.ui.core.Modifier, androidx.ui.unit.Dp size, long color, androidx.ui.graphics.Shape shape = RectangleShape);
  }

  public final class DrawBordersReceiver {
    method public void all(androidx.ui.foundation.Border border = defaultBorder);
    method public void allHorizontal(androidx.ui.foundation.Border border = defaultBorder);
    method public void allVertical(androidx.ui.foundation.Border border = defaultBorder);
    method public void bottom(androidx.ui.foundation.Border border = defaultBorder);
    method public void horizontal(int row, kotlin.ranges.IntRange columns = 0 <other> columnCount, androidx.ui.foundation.Border border = defaultBorder);
    method public void left(androidx.ui.foundation.Border border = defaultBorder);
    method public void outer(androidx.ui.foundation.Border border = defaultBorder);
    method public void right(androidx.ui.foundation.Border border = defaultBorder);
    method public void top(androidx.ui.foundation.Border border = defaultBorder);
    method public void vertical(int column, kotlin.ranges.IntRange rows = 0 <other> rowCount, androidx.ui.foundation.Border border = defaultBorder);
  }

  public final class IconKt {
    method public static void Icon-A4lfJGc(androidx.ui.graphics.vector.VectorAsset asset, androidx.ui.core.Modifier modifier = Modifier, long tint = contentColor());
    method public static void Icon-RCipKA8(androidx.ui.graphics.painter.Painter painter, androidx.ui.core.Modifier modifier = Modifier, long tint = contentColor());
    method public static void Icon-smRaMnI(androidx.ui.graphics.ImageAsset asset, androidx.ui.core.Modifier modifier = Modifier, long tint = contentColor());
  }

  public final class ImageKt {
    method public static inline void Image(androidx.ui.graphics.ImageAsset asset, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.core.ContentScale contentScale = ContentScale.Inside, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
    method public static inline void Image(androidx.ui.graphics.vector.VectorAsset asset, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.core.ContentScale contentScale = ContentScale.Inside, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
    method public static void Image(androidx.ui.graphics.painter.Painter painter, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.core.ContentScale contentScale = ContentScale.Inside, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
    method @Deprecated public static void SimpleImage--SSR55g(androidx.ui.graphics.ImageAsset image, long tint = Color.Unset);
  }

  public final class ScrollerKt {
    method public static void HorizontalScroller(androidx.ui.foundation.ScrollerPosition scrollerPosition = ScrollerPosition(), androidx.ui.core.Modifier modifier = Modifier, boolean isScrollable = true, kotlin.jvm.functions.Function0<kotlin.Unit> child);
    method public static androidx.ui.foundation.ScrollerPosition ScrollerPosition(float initial = 0f);
    method public static void VerticalScroller(androidx.ui.foundation.ScrollerPosition scrollerPosition = ScrollerPosition(), androidx.ui.core.Modifier modifier = Modifier, boolean isScrollable = true, kotlin.jvm.functions.Function0<kotlin.Unit> child);
  }

  public final class ScrollerPosition {
    ctor public ScrollerPosition(androidx.ui.foundation.animation.FlingConfig flingConfig, float initial, androidx.animation.AnimationClockObservable animationClock);
    method public float getMaxPosition();
    method public float getValue();
    method public boolean isAnimating();
    method public void scrollBy(float value);
    method public void scrollTo(float value);
    method public void smoothScrollBy(float value, kotlin.jvm.functions.Function2<? super androidx.animation.AnimationEndReason,? super java.lang.Float,kotlin.Unit> onEnd = { _, _ ->  });
    method public void smoothScrollTo(float value, kotlin.jvm.functions.Function2<? super androidx.animation.AnimationEndReason,? super java.lang.Float,kotlin.Unit> onEnd = { _, _ ->  });
    property public final boolean isAnimating;
    property public final float maxPosition;
    property public final float value;
  }

  public final class Strings {
    method public String getChecked();
    method public String getIndeterminate();
    method public String getNotSelected();
    method public String getSelected();
    method public String getUnchecked();
    property public final String Checked;
    property public final String Indeterminate;
    property public final String NotSelected;
    property public final String Selected;
    property public final String Unchecked;
    field public static final androidx.ui.foundation.Strings! INSTANCE;
  }

  public final class TableBordersKt {
    method public static void drawBorders(androidx.ui.layout.TableChildren, androidx.ui.foundation.Border defaultBorder = Border(Color.Black, Dp.Hairline), kotlin.jvm.functions.Function1<? super androidx.ui.foundation.DrawBordersReceiver,kotlin.Unit> block);
  }

  public final class TextFieldKt {
    method public static void TextField-QMJQIkg(androidx.ui.foundation.TextFieldValue value, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.foundation.TextFieldValue,kotlin.Unit> onValueChange, long textColor = Color.Unset, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onFocusChange = {}, String? focusIdentifier = null, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
  }

  public final class TextFieldValue {
    ctor public TextFieldValue(String text, androidx.ui.text.TextRange selection);
    ctor public TextFieldValue();
    method public String component1();
    method public androidx.ui.text.TextRange component2();
    method public androidx.ui.foundation.TextFieldValue copy(String text, androidx.ui.text.TextRange selection);
    method public androidx.ui.text.TextRange getSelection();
    method public String getText();
  }

  public final class TextKt {
    method public static void ProvideTextStyle(androidx.ui.text.TextStyle value, kotlin.jvm.functions.Function0<kotlin.Unit> children);
    method public static void Text-7SQZnBs(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier, long color = Color.Unset, androidx.ui.text.TextStyle style = currentTextStyle(), boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
    method public static void Text-oHc3XQk(String text, androidx.ui.core.Modifier modifier = Modifier, long color = Color.Unset, androidx.ui.text.TextStyle style = currentTextStyle(), boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {});
    method public static androidx.ui.text.TextStyle currentTextStyle();
  }

}

package androidx.ui.foundation.animation {

  public final class AndroidFlingCalculator {
    ctor public AndroidFlingCalculator(androidx.ui.unit.Density density);
    method public float flingDistance(float velocity);
    method public long flingDuration(float velocity);
    method public androidx.ui.foundation.animation.AndroidFlingCalculator.FlingInfo flingInfo(float velocity);
    method public androidx.ui.unit.Density getDensity();
  }

  public static final class AndroidFlingCalculator.FlingInfo {
    ctor public AndroidFlingCalculator.FlingInfo(float initialVelocity, float distance, long duration);
    method public float component1();
    method public float component2();
    method public long component3();
    method public androidx.ui.foundation.animation.AndroidFlingCalculator.FlingInfo copy(float initialVelocity, float distance, long duration);
    method public float getDistance();
    method public long getDuration();
    method public float getInitialVelocity();
    method public float position(long time);
    method public float velocity(long time);
  }

  public final class AndroidFlingCalculatorKt {
  }

  public final class AndroidFlingDecayAnimation implements androidx.animation.DecayAnimation {
    ctor public AndroidFlingDecayAnimation(androidx.ui.foundation.animation.AndroidFlingCalculator flingCalculator);
    method public float getAbsVelocityThreshold();
    method public long getDurationMillis(float start, float startVelocity);
    method public androidx.ui.foundation.animation.AndroidFlingCalculator getFlingCalculator();
    method public float getTarget(float start, float startVelocity);
    method public float getValue(long playTime, float start, float startVelocity);
    method public float getVelocity(long playTime, float start, float startVelocity);
    property public float absVelocityThreshold;
    property public final androidx.ui.foundation.animation.AndroidFlingCalculator flingCalculator;
  }

  public final class AndroidFlingSpline {
    method public double deceleration(float velocity, float friction);
    method public androidx.ui.foundation.animation.AndroidFlingSpline.FlingResult flingPosition(float time);
    field public static final androidx.ui.foundation.animation.AndroidFlingSpline! INSTANCE;
  }

  public static final class AndroidFlingSpline.FlingResult {
    ctor public AndroidFlingSpline.FlingResult(float distanceCoefficient, float velocityCoefficient);
    method public float component1();
    method public float component2();
    method public androidx.ui.foundation.animation.AndroidFlingSpline.FlingResult copy(float distanceCoefficient, float velocityCoefficient);
    method public float getDistanceCoefficient();
    method public float getVelocityCoefficient();
  }

  public final class AndroidFlingSplineKt {
  }

  public final class FlingConfig {
    ctor public FlingConfig(androidx.animation.DecayAnimation decayAnimation, kotlin.jvm.functions.Function3<? super androidx.animation.AnimationEndReason,? super java.lang.Float,? super java.lang.Float,kotlin.Unit>? onAnimationEnd, kotlin.jvm.functions.Function1<? super java.lang.Float,androidx.animation.TargetAnimation> adjustTarget);
    method public androidx.animation.DecayAnimation component1();
    method public kotlin.jvm.functions.Function3<androidx.animation.AnimationEndReason,java.lang.Float,java.lang.Float,kotlin.Unit>? component2();
    method public kotlin.jvm.functions.Function1<java.lang.Float,androidx.animation.TargetAnimation> component3();
    method public androidx.ui.foundation.animation.FlingConfig copy(androidx.animation.DecayAnimation decayAnimation, kotlin.jvm.functions.Function3<? super androidx.animation.AnimationEndReason,? super java.lang.Float,? super java.lang.Float,kotlin.Unit>? onAnimationEnd, kotlin.jvm.functions.Function1<? super java.lang.Float,androidx.animation.TargetAnimation> adjustTarget);
    method public kotlin.jvm.functions.Function1<java.lang.Float,androidx.animation.TargetAnimation> getAdjustTarget();
    method public androidx.animation.DecayAnimation getDecayAnimation();
    method public kotlin.jvm.functions.Function3<androidx.animation.AnimationEndReason,java.lang.Float,java.lang.Float,kotlin.Unit>? getOnAnimationEnd();
  }

  public final class FlingConfigKt {
    method public static androidx.ui.foundation.animation.FlingConfig AnchorsFlingConfig(java.util.List<java.lang.Float> anchors, androidx.animation.AnimationBuilder<java.lang.Float> animationBuilder = androidx.animation.PhysicsBuilder(), kotlin.jvm.functions.Function3<? super androidx.animation.AnimationEndReason,? super java.lang.Float,? super java.lang.Float,kotlin.Unit>? onAnimationEnd = null, androidx.animation.DecayAnimation decayAnimation = androidx.animation.ExponentialDecay());
    method public static androidx.ui.foundation.animation.FlingConfig FlingConfig(kotlin.jvm.functions.Function3<? super androidx.animation.AnimationEndReason,? super java.lang.Float,? super java.lang.Float,kotlin.Unit>? onAnimationEnd = null, kotlin.jvm.functions.Function1<? super java.lang.Float,androidx.animation.TargetAnimation> adjustTarget = { null });
    method public static void fling(androidx.animation.AnimatedFloat, androidx.ui.foundation.animation.FlingConfig config, float startVelocity);
  }

}

package androidx.ui.foundation.gestures {

  public abstract sealed class DragDirection {
  }

  public static final class DragDirection.Horizontal extends androidx.ui.foundation.gestures.DragDirection {
    field public static final androidx.ui.foundation.gestures.DragDirection.Horizontal! INSTANCE;
  }

  public static final class DragDirection.Vertical extends androidx.ui.foundation.gestures.DragDirection {
    field public static final androidx.ui.foundation.gestures.DragDirection.Vertical! INSTANCE;
  }

  public final class DraggableKt {
    method public static androidx.ui.core.Modifier draggable(androidx.ui.core.Modifier, androidx.ui.foundation.gestures.DragDirection dragDirection, kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit> onDragStarted = {}, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onDragStopped = {}, boolean enabled = true, boolean startDragImmediately = false, kotlin.jvm.functions.Function1<? super java.lang.Float,java.lang.Float> onDragDeltaConsumptionRequested);
  }

  public final class ScrollableKt {
    method public static androidx.ui.foundation.gestures.ScrollableState ScrollableState(kotlin.jvm.functions.Function1<? super java.lang.Float,java.lang.Float> onScrollDeltaConsumptionRequested);
    method public static androidx.ui.core.Modifier scrollable(androidx.ui.core.Modifier, androidx.ui.foundation.gestures.DragDirection dragDirection, androidx.ui.foundation.gestures.ScrollableState scrollableState, kotlin.jvm.functions.Function1<? super androidx.ui.unit.PxPosition,kotlin.Unit> onScrollStarted = {}, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onScrollStopped = {}, boolean enabled = true);
  }

  public final class ScrollableState {
    ctor public ScrollableState(kotlin.jvm.functions.Function1<? super java.lang.Float,java.lang.Float> onScrollDeltaConsumptionRequested, androidx.ui.foundation.animation.FlingConfig flingConfig, androidx.animation.AnimationClockObservable animationClock);
    method public androidx.ui.foundation.animation.FlingConfig getFlingConfig();
    method public kotlin.jvm.functions.Function1<java.lang.Float,java.lang.Float> getOnScrollDeltaConsumptionRequested();
    method public boolean isAnimating();
    method public void smoothScrollBy(float value, kotlin.jvm.functions.Function2<? super androidx.animation.AnimationEndReason,? super java.lang.Float,kotlin.Unit> onEnd = { _, _ ->  });
    method public void stopAnimation();
    property public final boolean isAnimating;
  }

}

package androidx.ui.foundation.selection {

  public final class MutuallyExclusiveSetItemKt {
    method public static void MutuallyExclusiveSetItem(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> children);
  }

  public final class ToggleableKt {
    method public static void Toggleable(boolean value, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onValueChange, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> children);
    method public static androidx.ui.foundation.selection.ToggleableState ToggleableState(boolean value);
    method public static void TriStateToggleable(androidx.ui.foundation.selection.ToggleableState state = androidx.ui.foundation.selection.ToggleableState.On, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, boolean enabled = true, androidx.ui.core.Modifier modifier = Modifier, kotlin.jvm.functions.Function0<kotlin.Unit> children);
  }

  public enum ToggleableState {
    enum_constant public static final androidx.ui.foundation.selection.ToggleableState Indeterminate;
    enum_constant public static final androidx.ui.foundation.selection.ToggleableState Off;
    enum_constant public static final androidx.ui.foundation.selection.ToggleableState On;
  }

}

package androidx.ui.foundation.semantics {

  public final class FoundationSemanticsProperties {
    method public androidx.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getInMutuallyExclusiveGroup();
    method public androidx.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getSelected();
    method public androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.foundation.selection.ToggleableState> getToggleableState();
    property public final androidx.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> InMutuallyExclusiveGroup;
    property public final androidx.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> Selected;
    property public final androidx.ui.semantics.SemanticsPropertyKey<androidx.ui.foundation.selection.ToggleableState> ToggleableState;
    field public static final androidx.ui.foundation.semantics.FoundationSemanticsProperties! INSTANCE;
  }

  public final class FoundationSemanticsPropertiesKt {
    method public static boolean getInMutuallyExclusiveGroup(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static boolean getSelected(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static androidx.ui.foundation.selection.ToggleableState getToggleableState(androidx.ui.semantics.SemanticsPropertyReceiver);
    method public static void setInMutuallyExclusiveGroup(androidx.ui.semantics.SemanticsPropertyReceiver, boolean p);
    method public static void setSelected(androidx.ui.semantics.SemanticsPropertyReceiver, boolean p);
    method public static void setToggleableState(androidx.ui.semantics.SemanticsPropertyReceiver, androidx.ui.foundation.selection.ToggleableState p);
  }

}

package androidx.ui.foundation.shape {

  public final class GenericShape implements androidx.ui.graphics.Shape {
    ctor public GenericShape(kotlin.jvm.functions.Function2<? super androidx.ui.graphics.Path,? super androidx.ui.unit.PxSize,kotlin.Unit> builder);
    method public androidx.ui.foundation.shape.GenericShape copy(kotlin.jvm.functions.Function2<? super androidx.ui.graphics.Path,? super androidx.ui.unit.PxSize,kotlin.Unit> builder);
    method public androidx.ui.graphics.Outline createOutline(androidx.ui.unit.PxSize size, androidx.ui.unit.Density density);
  }

  public final class RectangleShapeKt {
    method public static androidx.ui.graphics.Shape getRectangleShape();
  }

}

package androidx.ui.foundation.shape.corner {

  public abstract class CornerBasedShape implements androidx.ui.graphics.Shape {
    ctor public CornerBasedShape(androidx.ui.foundation.shape.corner.CornerSize topLeft, androidx.ui.foundation.shape.corner.CornerSize topRight, androidx.ui.foundation.shape.corner.CornerSize bottomRight, androidx.ui.foundation.shape.corner.CornerSize bottomLeft);
    method public abstract androidx.ui.foundation.shape.corner.CornerBasedShape copy(androidx.ui.foundation.shape.corner.CornerSize topLeft = topLeft, androidx.ui.foundation.shape.corner.CornerSize topRight = topRight, androidx.ui.foundation.shape.corner.CornerSize bottomRight = bottomRight, androidx.ui.foundation.shape.corner.CornerSize bottomLeft = bottomLeft);
    method public final androidx.ui.foundation.shape.corner.CornerBasedShape copy(androidx.ui.foundation.shape.corner.CornerSize all);
    method public final androidx.ui.graphics.Outline createOutline(androidx.ui.unit.PxSize size, androidx.ui.unit.Density density);
    method public abstract androidx.ui.graphics.Outline createOutline-45bKZN0(androidx.ui.unit.PxSize size, float topLeft, float topRight, float bottomRight, float bottomLeft);
    method public final androidx.ui.foundation.shape.corner.CornerSize getBottomLeft();
    method public final androidx.ui.foundation.shape.corner.CornerSize getBottomRight();
    method public final androidx.ui.foundation.shape.corner.CornerSize getTopLeft();
    method public final androidx.ui.foundation.shape.corner.CornerSize getTopRight();
  }

  public interface CornerSize {
    method public float toPx(androidx.ui.unit.PxSize shapeSize, androidx.ui.unit.Density density);
  }

  public final class CornerSizeKt {
    method public static androidx.ui.foundation.shape.corner.CornerSize CornerSize(androidx.ui.unit.Dp size);
    method public static androidx.ui.foundation.shape.corner.CornerSize CornerSize(@IntRange(from=0, to=50) int percent);
    method public static androidx.ui.foundation.shape.corner.CornerSize CornerSize(@FloatRange(from=0.0, to=50.0) float percent);
    method public static androidx.ui.foundation.shape.corner.CornerSize CornerSize-NgWp0Z8(float size);
    method public static androidx.ui.foundation.shape.corner.CornerSize getZeroCornerSize();
  }

  public final class CutCornerShape extends androidx.ui.foundation.shape.corner.CornerBasedShape {
    ctor public CutCornerShape(androidx.ui.foundation.shape.corner.CornerSize topLeft, androidx.ui.foundation.shape.corner.CornerSize topRight, androidx.ui.foundation.shape.corner.CornerSize bottomRight, androidx.ui.foundation.shape.corner.CornerSize bottomLeft);
    method public androidx.ui.foundation.shape.corner.CutCornerShape copy(androidx.ui.foundation.shape.corner.CornerSize topLeft, androidx.ui.foundation.shape.corner.CornerSize topRight, androidx.ui.foundation.shape.corner.CornerSize bottomRight, androidx.ui.foundation.shape.corner.CornerSize bottomLeft);
    method public androidx.ui.graphics.Outline createOutline-45bKZN0(androidx.ui.unit.PxSize size, float topLeft, float topRight, float bottomRight, float bottomLeft);
  }

  public final class CutCornerShapeKt {
    method public static androidx.ui.foundation.shape.corner.CutCornerShape CutCornerShape(androidx.ui.foundation.shape.corner.CornerSize corner);
    method public static androidx.ui.foundation.shape.corner.CutCornerShape CutCornerShape(androidx.ui.unit.Dp size);
    method public static androidx.ui.foundation.shape.corner.CutCornerShape CutCornerShape(int percent);
    method public static androidx.ui.foundation.shape.corner.CutCornerShape CutCornerShape(androidx.ui.unit.Dp topLeft = 0.dp, androidx.ui.unit.Dp topRight = 0.dp, androidx.ui.unit.Dp bottomRight = 0.dp, androidx.ui.unit.Dp bottomLeft = 0.dp);
    method public static androidx.ui.foundation.shape.corner.CutCornerShape CutCornerShape(@IntRange(from=0, to=50) int topLeftPercent = 0, @IntRange(from=0, to=50) int topRightPercent = 0, @IntRange(from=0, to=50) int bottomRightPercent = 0, @IntRange(from=0, to=50) int bottomLeftPercent = 0);
    method public static androidx.ui.foundation.shape.corner.CutCornerShape CutCornerShape-NgWp0Z8(float size);
    method public static androidx.ui.foundation.shape.corner.CutCornerShape CutCornerShape-wHlpFhg(float topLeft = 0.px, float topRight = 0.px, float bottomRight = 0.px, float bottomLeft = 0.px);
  }

  public final class RoundedCornerShape extends androidx.ui.foundation.shape.corner.CornerBasedShape {
    ctor public RoundedCornerShape(androidx.ui.foundation.shape.corner.CornerSize topLeft, androidx.ui.foundation.shape.corner.CornerSize topRight, androidx.ui.foundation.shape.corner.CornerSize bottomRight, androidx.ui.foundation.shape.corner.CornerSize bottomLeft);
    method public androidx.ui.foundation.shape.corner.RoundedCornerShape copy(androidx.ui.foundation.shape.corner.CornerSize topLeft, androidx.ui.foundation.shape.corner.CornerSize topRight, androidx.ui.foundation.shape.corner.CornerSize bottomRight, androidx.ui.foundation.shape.corner.CornerSize bottomLeft);
    method public androidx.ui.graphics.Outline createOutline-45bKZN0(androidx.ui.unit.PxSize size, float topLeft, float topRight, float bottomRight, float bottomLeft);
  }

  public final class RoundedCornerShapeKt {
    method public static androidx.ui.foundation.shape.corner.RoundedCornerShape RoundedCornerShape(androidx.ui.foundation.shape.corner.CornerSize corner);
    method public static androidx.ui.foundation.shape.corner.RoundedCornerShape RoundedCornerShape(androidx.ui.unit.Dp size);
    method public static androidx.ui.foundation.shape.corner.RoundedCornerShape RoundedCornerShape(int percent);
    method public static androidx.ui.foundation.shape.corner.RoundedCornerShape RoundedCornerShape(androidx.ui.unit.Dp topLeft = 0.dp, androidx.ui.unit.Dp topRight = 0.dp, androidx.ui.unit.Dp bottomRight = 0.dp, androidx.ui.unit.Dp bottomLeft = 0.dp);
    method public static androidx.ui.foundation.shape.corner.RoundedCornerShape RoundedCornerShape(@IntRange(from=0, to=50) int topLeftPercent = 0, @IntRange(from=0, to=50) int topRightPercent = 0, @IntRange(from=0, to=50) int bottomRightPercent = 0, @IntRange(from=0, to=50) int bottomLeftPercent = 0);
    method public static androidx.ui.foundation.shape.corner.RoundedCornerShape RoundedCornerShape-NgWp0Z8(float size);
    method public static androidx.ui.foundation.shape.corner.RoundedCornerShape RoundedCornerShape-wHlpFhg(float topLeft = 0.px, float topRight = 0.px, float bottomRight = 0.px, float bottomLeft = 0.px);
    method public static androidx.ui.foundation.shape.corner.RoundedCornerShape getCircleShape();
  }

}

