library;
import self as self;
import "dart:core" as core;

abstract class FooBase<Tf extends core::Object = dynamic> extends core::Object {
  static field dynamic _redirecting# = <dynamic>[self::FooBase::•];
  abstract get x() → core::int;
  static factory •<Tf extends core::Object = dynamic>(core::int x) → self::FooBase<self::FooBase::•::Tf>
    let dynamic #redirecting_factory = self::Foo::• in let self::FooBase::•::Tf #typeArg0 = null in invalid-expression;
}
abstract class Foo<T extends core::Object = dynamic> extends core::Object implements self::FooBase<dynamic> {
  static field dynamic _redirecting# = <dynamic>[self::Foo::•];
  static factory •<T extends core::Object = dynamic>(core::int x) → self::Foo<self::Foo::•::T>
    let dynamic #redirecting_factory = self::Bar::• in let core::String #typeArg0 = null in let self::Foo::•::T #typeArg1 = null in invalid-expression;
}
class Bar<Sb extends core::Object = dynamic, Tb extends core::Object = dynamic> extends core::Object implements self::Foo<self::Bar::Tb> {
  field core::int x;
  constructor •(core::int x) → void
    ;
}
class Builder<X extends core::Object = dynamic> extends core::Object {
  synthetic constructor •() → void
    ;
  method method() → dynamic
    ;
}
class SimpleCase<A extends core::Object = dynamic, B extends core::Object = dynamic> extends core::Object {
  static field dynamic _redirecting# = <dynamic>[self::SimpleCase::•];
  static factory •<A extends core::Object = dynamic, B extends core::Object = dynamic>() → self::SimpleCase<self::SimpleCase::•::A, self::SimpleCase::•::B>
    let dynamic #redirecting_factory = self::SimpleCaseImpl::• in let self::SimpleCase::•::A #typeArg0 = null in let self::SimpleCase::•::B #typeArg1 = null in invalid-expression;
}
class SimpleCaseImpl<Ai extends core::Object = dynamic, Bi extends core::Object = dynamic> extends core::Object implements self::SimpleCase<self::SimpleCaseImpl::Ai, self::SimpleCaseImpl::Bi> {
  static field dynamic _redirecting# = <dynamic>[self::SimpleCaseImpl::•];
  static factory •<Ai extends core::Object = dynamic, Bi extends core::Object = dynamic>() → self::SimpleCaseImpl<self::SimpleCaseImpl::•::Ai, self::SimpleCaseImpl::•::Bi>
    let dynamic #redirecting_factory = self::SimpleCaseImpl2::• in let self::SimpleCaseImpl::•::Ai #typeArg0 = null in let self::SimpleCaseImpl::•::Bi #typeArg1 = null in invalid-expression;
}
class SimpleCaseImpl2<Ai2 extends core::Object = dynamic, Bi2 extends core::Object = dynamic> extends core::Object implements self::SimpleCaseImpl<self::SimpleCaseImpl2::Ai2, self::SimpleCaseImpl2::Bi2> {
  synthetic constructor •() → void
    ;
}
class Base<M extends core::Object = dynamic> extends core::Object {
  synthetic constructor •() → void
    ;
}
class Mixin<M extends core::Object = dynamic> extends core::Object {
  synthetic constructor •() → void
    ;
}
class Mix<M extends core::Object = dynamic> = self::Base<self::Mix::M> with self::Mixin<self::Mix::M> {
  synthetic constructor •() → void
    : super self::Base::•()
    ;
}
static method main() → dynamic
  ;
