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

abstract class _B&Object&M1 = core::Object with self::M1 {
}
abstract class _B&Object&M1&M2 = self::_B&Object&M1 with self::M2 {
}
class B extends self::_B&Object&M1&M2 {
  constructor •(dynamic value) → void
    : super core::Object::•()
    ;
}
abstract class M1 extends core::Object {
  synthetic constructor •() → void
    : super core::Object::•()
    ;
  method m() → dynamic
    return core::print("M1");
}
abstract class M2 extends core::Object {
  synthetic constructor •() → void
    : super core::Object::•()
    ;
  method m() → dynamic
    return core::print("M2");
}
abstract class _C&Object&M1 = core::Object with self::M1 {
}
abstract class _C&Object&M1&M2 = self::_C&Object&M1 with self::M2 {
}
class C extends self::_C&Object&M1&M2 {
  constructor •(dynamic value) → void
    : super core::Object::•()
    ;
}
abstract class G1<T extends core::Object> extends core::Object {
  synthetic constructor •() → void
    : super core::Object::•()
    ;
  method m() → dynamic
    return core::print(self::G1::T);
}
abstract class _D&Object&G1<S extends core::Object> = core::Object with self::G1<self::_D&Object&G1::S> {
}
class D<S extends core::Object> extends self::_D&Object&G1<self::D::S> {
  synthetic constructor •() → void
    : super core::Object::•()
    ;
}
static method main() → dynamic {
  new self::B::•(null).{self::M2::m}();
  new self::C::•(null).{self::M2::m}();
  new self::D::•<dynamic>().{self::G1::m}();
  new self::D::•<core::int>().{self::G1::m}();
  new self::D::•<core::List<core::int>>().{self::G1::m}();
}
