library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;

abstract class A<T extends core::Object? = dynamic> extends core::Object {
  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
  static factory •<T extends core::Object? = dynamic>() → self::A<self::A::•::T%>
    return self::B::•<dynamic, self::A::•::T%>();
  static method _#new#tearOff<T extends core::Object? = dynamic>() → self::A<self::A::_#new#tearOff::T%>
    return new self::C::•<self::A::_#new#tearOff::T%, dynamic, dynamic>();
}
abstract class B<S extends core::Object? = dynamic, T extends core::Object? = dynamic> extends core::Object implements self::A<self::B::T%> {
  static final field dynamic _redirecting# = <dynamic>[#C2]/*isLegacy*/;
  static factory •<S extends core::Object? = dynamic, T extends core::Object? = dynamic>() → self::B<self::B::•::S%, self::B::•::T%>
    return new self::C::•<self::B::•::T%, self::B::•::S%, dynamic>();
  static method _#new#tearOff<S extends core::Object? = dynamic, T extends core::Object? = dynamic>() → self::B<self::B::_#new#tearOff::S%, self::B::_#new#tearOff::T%>
    return new self::C::•<self::B::_#new#tearOff::T%, self::B::_#new#tearOff::S%, dynamic>();
}
class C<T extends core::Object? = dynamic, S extends core::Object? = dynamic, U extends core::Object? = dynamic> extends core::Object implements self::B<self::C::S%, self::C::T%> /*hasConstConstructor*/  {
  const constructor •() → self::C<self::C::T%, self::C::S%, self::C::U%>
    : super core::Object::•()
    ;
  static method _#new#tearOff<T extends core::Object? = dynamic, S extends core::Object? = dynamic, U extends core::Object? = dynamic>() → self::C<self::C::_#new#tearOff::T%, self::C::_#new#tearOff::S%, self::C::_#new#tearOff::U%>
    return new self::C::•<self::C::_#new#tearOff::T%, self::C::_#new#tearOff::S%, self::C::_#new#tearOff::U%>();
}
static method main() → dynamic {
  #C4;
  #C6;
  #C8;
}

constants  {
  #C1 = constructor-tearoff self::A::•
  #C2 = constructor-tearoff self::B::•
  #C3 = static-tearoff self::A::_#new#tearOff
  #C4 = instantiation #C3 <core::int*>
  #C5 = static-tearoff self::B::_#new#tearOff
  #C6 = instantiation #C5 <core::String*, core::double*>
  #C7 = static-tearoff self::C::_#new#tearOff
  #C8 = instantiation #C7 <core::bool*, core::num*, void>
}
