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

typedef F = self::A;
typedef G0 = self::B<dynamic>;
typedef G1 = self::B<core::int>;
typedef G2<T extends core::Object? = dynamic> = self::B<T%>;
typedef G3<T extends core::num> = self::B<T>;
typedef H0 = self::C<dynamic, dynamic>;
typedef H1 = self::C<core::int, core::String>;
typedef H2<T extends core::Object? = dynamic> = self::C<core::int, T%>;
typedef H3<T extends core::Object? = dynamic, S extends core::Object? = dynamic> = self::C<T%, S%>;
typedef H4<T extends core::Object? = dynamic, S extends core::Object? = dynamic> = self::C<S%, T%>;
typedef H5<T extends core::num, S extends core::Object? = dynamic> = self::C<T, S%>;
typedef H6<T extends core::Object? = dynamic, S extends core::num> = self::C<T%, S>;
typedef I0 = self::D<core::num>;
typedef I1 = self::D<core::num>;
typedef I2<T extends core::num> = self::D<T>;
typedef I3<T extends core::int> = self::D<T>;
class A extends core::Object {
  synthetic constructor •() → self::A
    : super core::Object::•()
    ;
  static method _#new#tearOff() → self::A
    return new self::A::•();
}
class B<T extends core::Object? = dynamic> extends core::Object {
  synthetic constructor •() → self::B<self::B::T%>
    : super core::Object::•()
    ;
  static method _#new#tearOff<T extends core::Object? = dynamic>() → self::B<self::B::_#new#tearOff::T%>
    return new self::B::•<self::B::_#new#tearOff::T%>();
}
class C<X extends core::Object? = dynamic, Y extends core::Object? = dynamic> extends core::Object {
  synthetic constructor •() → self::C<self::C::X%, self::C::Y%>
    : super core::Object::•()
    ;
  static method _#new#tearOff<X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → self::C<self::C::_#new#tearOff::X%, self::C::_#new#tearOff::Y%>
    return new self::C::•<self::C::_#new#tearOff::X%, self::C::_#new#tearOff::Y%>();
}
class D<X extends core::num> extends core::Object {
  synthetic constructor •() → self::D<self::D::X>
    : super core::Object::•()
    ;
  static method _#new#tearOff<X extends core::num>() → self::D<self::D::_#new#tearOff::X>
    return new self::D::•<self::D::_#new#tearOff::X>();
}
static method main() → dynamic {
  () → self::A f = #C1;
  () → self::B<dynamic> g0 = #C3;
  () → self::B<core::int> g1 = #C4;
  <T extends core::Object? = dynamic>() → self::B<T%> g2a = #C2;
  () → self::B<core::int> g2b = #C4;
  <T extends core::num>() → self::B<T> g3a = #C5;
  () → self::B<core::int> g3b = #C4;
  () → self::C<dynamic, dynamic> h0 = #C7;
  () → self::C<core::int, core::String> h1 = #C8;
  <T extends core::Object? = dynamic>() → self::C<core::int, T%> h2a = #C9;
  () → self::C<core::int, core::int> h2b = #C10;
  <X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → self::C<X%, Y%> h3a = #C6;
  () → self::C<core::int, core::String> h3b = #C8;
  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>() → self::C<S%, T%> h4a = #C11;
  () → self::C<core::String, core::int> h4b = #C12;
  <T extends core::num, S extends core::Object? = dynamic>() → self::C<T, S%> h5a = #C13;
  () → self::C<core::int, core::String> h5b = #C8;
  <T extends core::Object? = dynamic, S extends core::num>() → self::C<T%, S> h6a = #C14;
  () → self::C<core::String, core::int> h6b = #C12;
  () → self::D<core::num> i0 = #C16;
  () → self::D<core::num> i1 = #C16;
  <X extends core::num>() → self::D<X> i2a = #C15;
  () → self::D<core::int> i2b = #C17;
  <T extends core::int>() → self::D<T> i3a = #C18;
  () → self::D<core::int> i3b = #C17;
}
static method _#G3#new#tearOff<T extends core::num>() → self::B<self::_#G3#new#tearOff::T>
  return new self::B::•<self::_#G3#new#tearOff::T>();
static method _#H2#new#tearOff<T extends core::Object? = dynamic>() → self::C<core::int, self::_#H2#new#tearOff::T%>
  return new self::C::•<core::int, self::_#H2#new#tearOff::T%>();
static method _#H4#new#tearOff<T extends core::Object? = dynamic, S extends core::Object? = dynamic>() → self::C<self::_#H4#new#tearOff::S%, self::_#H4#new#tearOff::T%>
  return new self::C::•<self::_#H4#new#tearOff::S%, self::_#H4#new#tearOff::T%>();
static method _#H5#new#tearOff<T extends core::num, S extends core::Object? = dynamic>() → self::C<self::_#H5#new#tearOff::T, self::_#H5#new#tearOff::S%>
  return new self::C::•<self::_#H5#new#tearOff::T, self::_#H5#new#tearOff::S%>();
static method _#H6#new#tearOff<T extends core::Object? = dynamic, S extends core::num>() → self::C<self::_#H6#new#tearOff::T%, self::_#H6#new#tearOff::S>
  return new self::C::•<self::_#H6#new#tearOff::T%, self::_#H6#new#tearOff::S>();
static method _#I3#new#tearOff<T extends core::int>() → self::D<self::_#I3#new#tearOff::T>
  return new self::D::•<self::_#I3#new#tearOff::T>();

constants  {
  #C1 = static-tearoff self::A::_#new#tearOff
  #C2 = static-tearoff self::B::_#new#tearOff
  #C3 = instantiation #C2 <dynamic>
  #C4 = instantiation #C2 <core::int*>
  #C5 = static-tearoff self::_#G3#new#tearOff
  #C6 = static-tearoff self::C::_#new#tearOff
  #C7 = instantiation #C6 <dynamic, dynamic>
  #C8 = instantiation #C6 <core::int*, core::String*>
  #C9 = static-tearoff self::_#H2#new#tearOff
  #C10 = instantiation #C6 <core::int*, core::int*>
  #C11 = static-tearoff self::_#H4#new#tearOff
  #C12 = instantiation #C6 <core::String*, core::int*>
  #C13 = static-tearoff self::_#H5#new#tearOff
  #C14 = static-tearoff self::_#H6#new#tearOff
  #C15 = static-tearoff self::D::_#new#tearOff
  #C16 = instantiation #C15 <core::num*>
  #C17 = instantiation #C15 <core::int*>
  #C18 = static-tearoff self::_#I3#new#tearOff
}
