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

typedef ListList<T extends core::Object? = dynamic> = core::List<core::List<T%>>;
class C extends core::Object {
  synthetic constructor •() → self::C
    ;
  static method stat<T extends core::Object? = dynamic>(self::C::stat::T% value) → self::C::stat::T%
    ;
  method inst<T extends core::Object? = dynamic>(self::C::inst::T% value) → self::C::inst::T%
    ;
  method method() → void
    ;
}
abstract class M extends self::C /*isMixinDeclaration*/  {
  static method mstat<T extends core::Object? = dynamic>(self::M::mstat::T% value) → self::M::mstat::T%
    ;
  method minst<T extends core::Object? = dynamic>(self::M::minst::T% value) → self::M::minst::T%
    ;
  method mmethod() → void
    ;
}
abstract class _D&C&M = self::C with self::M /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_D&C&M
    : super self::C::•()
    ;
  mixin-super-stub method minst<T extends core::Object? = dynamic>(self::_D&C&M::minst::T% value) → self::_D&C&M::minst::T%
    return super.{self::M::minst}<self::_D&C&M::minst::T%>(value);
  mixin-super-stub method mmethod() → void
    return super.{self::M::mmethod}();
}
class D extends self::_D&C&M {
  synthetic constructor •() → self::D
    ;
  method method() → void
    ;
}
extension Ext on self::C {
  static method estat = self::Ext|estat;
  method einst = self::Ext|einst;
  tearoff einst = self::Ext|get#einst;
  method emethod = self::Ext|emethod;
  tearoff emethod = self::Ext|get#emethod;
}
static method top<T extends core::Object? = dynamic>(self::top::T% value) → self::top::T%
  ;
static method Ext|estat<T extends core::Object? = dynamic>(self::Ext|estat::T% value) → self::Ext|estat::T%
  ;
static method Ext|einst<T extends core::Object? = dynamic>(lowered final self::C #this, self::Ext|einst::T% value) → self::Ext|einst::T%
  ;
static method Ext|get#einst(lowered final self::C #this) → <T extends core::Object? = dynamic>(T%) → T%
  return <T extends core::Object? = dynamic>(T% value) → T% => self::Ext|einst<T%>(#this, value);
static method Ext|emethod(lowered final self::C #this) → void
  ;
static method Ext|get#emethod(lowered final self::C #this) → () → void
  return () → void => self::Ext|emethod(#this);
static method main() → void
  ;
static method _#ListList#new#tearOff<T extends core::Object? = dynamic>([core::int? length]) → core::List<core::List<self::_#ListList#new#tearOff::T%>>
  return core::List::•<core::List<self::_#ListList#new#tearOff::T%>>(length);
static method _#ListList#filled#tearOff<T extends core::Object? = dynamic>(core::int length, core::List<self::_#ListList#filled#tearOff::T%> fill, {core::bool growable}) → core::List<core::List<self::_#ListList#filled#tearOff::T%>>
  return core::List::filled<core::List<self::_#ListList#filled#tearOff::T%>>(length, fill, growable: growable);
static method _#ListList#empty#tearOff<T extends core::Object? = dynamic>({core::bool growable}) → core::List<core::List<self::_#ListList#empty#tearOff::T%>>
  return core::List::empty<core::List<self::_#ListList#empty#tearOff::T%>>(growable: growable);
static method _#ListList#from#tearOff<T extends core::Object? = dynamic>(core::Iterable<dynamic> elements, {core::bool growable}) → core::List<core::List<self::_#ListList#from#tearOff::T%>>
  return core::List::from<core::List<self::_#ListList#from#tearOff::T%>>(elements, growable: growable);
static method _#ListList#of#tearOff<T extends core::Object? = dynamic>(core::Iterable<core::List<self::_#ListList#of#tearOff::T%>> elements, {core::bool growable}) → core::List<core::List<self::_#ListList#of#tearOff::T%>>
  return core::List::of<core::List<self::_#ListList#of#tearOff::T%>>(elements, growable: growable);
static method _#ListList#generate#tearOff<T extends core::Object? = dynamic>(core::int length, (core::int) → core::List<self::_#ListList#generate#tearOff::T%> generator, {core::bool growable}) → core::List<core::List<self::_#ListList#generate#tearOff::T%>>
  return core::List::generate<core::List<self::_#ListList#generate#tearOff::T%>>(length, generator, growable: growable);
static method _#ListList#unmodifiable#tearOff<T extends core::Object? = dynamic>(core::Iterable<dynamic> elements) → core::List<core::List<self::_#ListList#unmodifiable#tearOff::T%>>
  return core::List::unmodifiable<core::List<self::_#ListList#unmodifiable#tearOff::T%>>(elements);
