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

import "org-dartlang-testcase:///cache_lookups_lib.dart";

class Class extends core::Object {
  synthetic constructor •() → self::Class
    ;
  get field() → core::int
    ;
}
static field core::int counter;
static method test(dynamic o) → dynamic
  ;
static method main() → dynamic
  ;
static method expect(dynamic expected, dynamic actual) → dynamic
  ;

library;
import self as self2;
import "dart:core" as core;
import "dart:collection" as col;
import "dart:math" as math;

import "dart:collection";
import "org-dartlang-testcase:///cache_lookups.dart";

abstract class _CustomList&Object&ListMixin<E extends core::Object? = dynamic> = core::Object with col::ListBase<self2::_CustomList&Object&ListMixin::E%> /*isAnonymousMixin,hasConstConstructor*/  {
  const synthetic constructor •() → self2::_CustomList&Object&ListMixin<self2::_CustomList&Object&ListMixin::E%>
    : super core::Object::•()
    ;
  mixin-super-stub get first() → self2::_CustomList&Object&ListMixin::E%
    return super.{col::ListBase::first};
  mixin-super-stub set first(covariant-by-class self2::_CustomList&Object&ListMixin::E% value) → void
    return super.{col::ListBase::first} = value;
  mixin-super-stub get last() → self2::_CustomList&Object&ListMixin::E%
    return super.{col::ListBase::last};
  mixin-super-stub set last(covariant-by-class self2::_CustomList&Object&ListMixin::E% value) → void
    return super.{col::ListBase::last} = value;
  mixin-super-stub get iterator() → core::Iterator<self2::_CustomList&Object&ListMixin::E%>
    return super.{col::ListBase::iterator};
  mixin-super-stub method elementAt(core::int index) → self2::_CustomList&Object&ListMixin::E%
    return super.{col::ListBase::elementAt}(index);
  mixin-super-stub method followedBy(covariant-by-class core::Iterable<self2::_CustomList&Object&ListMixin::E%> other) → core::Iterable<self2::_CustomList&Object&ListMixin::E%>
    return super.{col::ListBase::followedBy}(other);
  mixin-super-stub method forEach((self2::_CustomList&Object&ListMixin::E%) → void action) → void
    return super.{col::ListBase::forEach}(action);
  mixin-super-stub get isEmpty() → core::bool
    return super.{col::ListBase::isEmpty};
  mixin-super-stub get isNotEmpty() → core::bool
    return super.{col::ListBase::isNotEmpty};
  mixin-super-stub get single() → self2::_CustomList&Object&ListMixin::E%
    return super.{col::ListBase::single};
  mixin-super-stub method contains(core::Object? element) → core::bool
    return super.{col::ListBase::contains}(element);
  mixin-super-stub method every((self2::_CustomList&Object&ListMixin::E%) → core::bool test) → core::bool
    return super.{col::ListBase::every}(test);
  mixin-super-stub method any((self2::_CustomList&Object&ListMixin::E%) → core::bool test) → core::bool
    return super.{col::ListBase::any}(test);
  mixin-super-stub method firstWhere((self2::_CustomList&Object&ListMixin::E%) → core::bool test, {covariant-by-class () →? self2::_CustomList&Object&ListMixin::E% orElse}) → self2::_CustomList&Object&ListMixin::E%
    return super.{col::ListBase::firstWhere}(test, orElse: orElse);
  mixin-super-stub method lastWhere((self2::_CustomList&Object&ListMixin::E%) → core::bool test, {covariant-by-class () →? self2::_CustomList&Object&ListMixin::E% orElse}) → self2::_CustomList&Object&ListMixin::E%
    return super.{col::ListBase::lastWhere}(test, orElse: orElse);
  mixin-super-stub method singleWhere((self2::_CustomList&Object&ListMixin::E%) → core::bool test, {covariant-by-class () →? self2::_CustomList&Object&ListMixin::E% orElse}) → self2::_CustomList&Object&ListMixin::E%
    return super.{col::ListBase::singleWhere}(test, orElse: orElse);
  mixin-super-stub method join([core::String separator]) → core::String
    return super.{col::ListBase::join}(separator);
  mixin-super-stub method where((self2::_CustomList&Object&ListMixin::E%) → core::bool test) → core::Iterable<self2::_CustomList&Object&ListMixin::E%>
    return super.{col::ListBase::where}(test);
  mixin-super-stub method whereType<T extends core::Object? = dynamic>() → core::Iterable<self2::_CustomList&Object&ListMixin::whereType::T%>
    return super.{col::ListBase::whereType}<self2::_CustomList&Object&ListMixin::whereType::T%>();
  mixin-super-stub method map<T extends core::Object? = dynamic>((self2::_CustomList&Object&ListMixin::E%) → self2::_CustomList&Object&ListMixin::map::T% f) → core::Iterable<self2::_CustomList&Object&ListMixin::map::T%>
    return super.{col::ListBase::map}<self2::_CustomList&Object&ListMixin::map::T%>(f);
  mixin-super-stub method expand<T extends core::Object? = dynamic>((self2::_CustomList&Object&ListMixin::E%) → core::Iterable<self2::_CustomList&Object&ListMixin::expand::T%> f) → core::Iterable<self2::_CustomList&Object&ListMixin::expand::T%>
    return super.{col::ListBase::expand}<self2::_CustomList&Object&ListMixin::expand::T%>(f);
  mixin-super-stub method reduce(covariant-by-class (self2::_CustomList&Object&ListMixin::E%, self2::_CustomList&Object&ListMixin::E%) → self2::_CustomList&Object&ListMixin::E% combine) → self2::_CustomList&Object&ListMixin::E%
    return super.{col::ListBase::reduce}(combine);
  mixin-super-stub method fold<T extends core::Object? = dynamic>(self2::_CustomList&Object&ListMixin::fold::T% initialValue, (self2::_CustomList&Object&ListMixin::fold::T%, self2::_CustomList&Object&ListMixin::E%) → self2::_CustomList&Object&ListMixin::fold::T% combine) → self2::_CustomList&Object&ListMixin::fold::T%
    return super.{col::ListBase::fold}<self2::_CustomList&Object&ListMixin::fold::T%>(initialValue, combine);
  mixin-super-stub method skip(core::int count) → core::Iterable<self2::_CustomList&Object&ListMixin::E%>
    return super.{col::ListBase::skip}(count);
  mixin-super-stub method skipWhile((self2::_CustomList&Object&ListMixin::E%) → core::bool test) → core::Iterable<self2::_CustomList&Object&ListMixin::E%>
    return super.{col::ListBase::skipWhile}(test);
  mixin-super-stub method take(core::int count) → core::Iterable<self2::_CustomList&Object&ListMixin::E%>
    return super.{col::ListBase::take}(count);
  mixin-super-stub method takeWhile((self2::_CustomList&Object&ListMixin::E%) → core::bool test) → core::Iterable<self2::_CustomList&Object&ListMixin::E%>
    return super.{col::ListBase::takeWhile}(test);
  mixin-super-stub method toList({core::bool growable}) → core::List<self2::_CustomList&Object&ListMixin::E%>
    return super.{col::ListBase::toList}(growable: growable);
  mixin-super-stub method toSet() → core::Set<self2::_CustomList&Object&ListMixin::E%>
    return super.{col::ListBase::toSet}();
  mixin-super-stub method add(covariant-by-class self2::_CustomList&Object&ListMixin::E% element) → void
    return super.{col::ListBase::add}(element);
  mixin-super-stub method addAll(covariant-by-class core::Iterable<self2::_CustomList&Object&ListMixin::E%> iterable) → void
    return super.{col::ListBase::addAll}(iterable);
  mixin-super-stub method remove(core::Object? element) → core::bool
    return super.{col::ListBase::remove}(element);
  mixin-super-stub method _closeGap(core::int start, core::int end) → void
    return super.{col::ListBase::_closeGap}(start, end);
  mixin-super-stub method removeWhere((self2::_CustomList&Object&ListMixin::E%) → core::bool test) → void
    return super.{col::ListBase::removeWhere}(test);
  mixin-super-stub method retainWhere((self2::_CustomList&Object&ListMixin::E%) → core::bool test) → void
    return super.{col::ListBase::retainWhere}(test);
  mixin-super-stub method _filter((self2::_CustomList&Object&ListMixin::E%) → core::bool test, core::bool retainMatching) → void
    return super.{col::ListBase::_filter}(test, retainMatching);
  mixin-super-stub method clear() → void
    return super.{col::ListBase::clear}();
  mixin-super-stub method cast<R extends core::Object? = dynamic>() → core::List<self2::_CustomList&Object&ListMixin::cast::R%>
    return super.{col::ListBase::cast}<self2::_CustomList&Object&ListMixin::cast::R%>();
  mixin-super-stub method removeLast() → self2::_CustomList&Object&ListMixin::E%
    return super.{col::ListBase::removeLast}();
  mixin-super-stub method sort([(self2::_CustomList&Object&ListMixin::E%, self2::_CustomList&Object&ListMixin::E%) →? core::int compare]) → void
    return super.{col::ListBase::sort}(compare);
  mixin-super-stub method shuffle([math::Random? random]) → void
    return super.{col::ListBase::shuffle}(random);
  mixin-super-stub method asMap() → core::Map<core::int, self2::_CustomList&Object&ListMixin::E%>
    return super.{col::ListBase::asMap}();
  mixin-super-stub operator +(covariant-by-class core::List<self2::_CustomList&Object&ListMixin::E%> other) → core::List<self2::_CustomList&Object&ListMixin::E%>
    return super.{col::ListBase::+}(other);
  mixin-super-stub method sublist(core::int start, [core::int? end]) → core::List<self2::_CustomList&Object&ListMixin::E%>
    return super.{col::ListBase::sublist}(start, end);
  mixin-super-stub method getRange(core::int start, core::int end) → core::Iterable<self2::_CustomList&Object&ListMixin::E%>
    return super.{col::ListBase::getRange}(start, end);
  mixin-super-stub method removeRange(core::int start, core::int end) → void
    return super.{col::ListBase::removeRange}(start, end);
  mixin-super-stub method fillRange(core::int start, core::int end, [covariant-by-class self2::_CustomList&Object&ListMixin::E? fill]) → void
    return super.{col::ListBase::fillRange}(start, end, fill);
  mixin-super-stub method setRange(core::int start, core::int end, covariant-by-class core::Iterable<self2::_CustomList&Object&ListMixin::E%> iterable, [core::int skipCount]) → void
    return super.{col::ListBase::setRange}(start, end, iterable, skipCount);
  mixin-super-stub method replaceRange(core::int start, core::int end, covariant-by-class core::Iterable<self2::_CustomList&Object&ListMixin::E%> newContents) → void
    return super.{col::ListBase::replaceRange}(start, end, newContents);
  mixin-super-stub method indexOf(covariant-by-class core::Object? element, [core::int start]) → core::int
    return super.{col::ListBase::indexOf}(element, start);
  mixin-super-stub method indexWhere((self2::_CustomList&Object&ListMixin::E%) → core::bool test, [core::int start]) → core::int
    return super.{col::ListBase::indexWhere}(test, start);
  mixin-super-stub method lastIndexOf(covariant-by-class core::Object? element, [core::int? start]) → core::int
    return super.{col::ListBase::lastIndexOf}(element, start);
  mixin-super-stub method lastIndexWhere((self2::_CustomList&Object&ListMixin::E%) → core::bool test, [core::int? start]) → core::int
    return super.{col::ListBase::lastIndexWhere}(test, start);
  mixin-super-stub method insert(core::int index, covariant-by-class self2::_CustomList&Object&ListMixin::E% element) → void
    return super.{col::ListBase::insert}(index, element);
  mixin-super-stub method removeAt(core::int index) → self2::_CustomList&Object&ListMixin::E%
    return super.{col::ListBase::removeAt}(index);
  mixin-super-stub method insertAll(core::int index, covariant-by-class core::Iterable<self2::_CustomList&Object&ListMixin::E%> iterable) → void
    return super.{col::ListBase::insertAll}(index, iterable);
  mixin-super-stub method setAll(core::int index, covariant-by-class core::Iterable<self2::_CustomList&Object&ListMixin::E%> iterable) → void
    return super.{col::ListBase::setAll}(index, iterable);
  mixin-super-stub get reversed() → core::Iterable<self2::_CustomList&Object&ListMixin::E%>
    return super.{col::ListBase::reversed};
  mixin-super-stub method toString() → core::String
    return super.{col::ListBase::toString}();
}
class CustomList<E extends core::Object? = dynamic> extends self2::_CustomList&Object&ListMixin<self2::CustomList::E%> {
  final field core::List<self2::CustomList::E%> list;
  constructor •(core::List<self2::CustomList::E%> list) → self2::CustomList<self2::CustomList::E%>
    ;
  get length() → core::int
    ;
  set length(core::int value) → void
    ;
  operator [](core::int index) → self2::CustomList::E%
    ;
  operator []=(core::int index, covariant-by-class self2::CustomList::E% value) → void
    ;
}
