library;
import self as self;
import "dart:core" as core;
import "dart:collection" as col;
import "dart:_internal" as _in;
import "dart:_compact_hash" as _co;
import "dart:math" as math;

import "dart:collection";

class NegativeLengthList<E extends core::Object? = dynamic> extends self::_NegativeLengthList&Object&ListMixin<self::NegativeLengthList::E%> {
  final field core::List<self::NegativeLengthList::E%> _list;
  constructor •(core::List<self::NegativeLengthList::E%> _list) → self::NegativeLengthList<self::NegativeLengthList::E%>
    : self::NegativeLengthList::_list = _list, super self::_NegativeLengthList&Object&ListMixin::•()
    ;
  get length() → core::int
    return this.{self::NegativeLengthList::_list}{core::List<self::NegativeLengthList::E%>}.{core::List::length}{core::int}.{core::num::<=}(0){(core::num) → core::bool} ?{core::int} 1.{core::int::unary-}(){() → core::int} : this.{self::NegativeLengthList::_list}{core::List<self::NegativeLengthList::E%>}.{core::List::length}{core::int};
  set length(core::int value) → void {
    this.{self::NegativeLengthList::_list}{core::List<self::NegativeLengthList::E%>}.{core::List::length} = value;
  }
  operator [](core::int index) → self::NegativeLengthList::E%
    return this.{self::NegativeLengthList::_list}{core::List<self::NegativeLengthList::E%>}.{core::List::[]}(index){(core::int) → self::NegativeLengthList::E%};
  operator []=(core::int index, covariant-by-class self::NegativeLengthList::E% value) → void {
    this.{self::NegativeLengthList::_list}{core::List<self::NegativeLengthList::E%>}.{core::List::[]=}(index, value){(core::int, self::NegativeLengthList::E%) → void};
  }
}
abstract class _NegativeLengthList&Object&ListMixin<E extends core::Object? = dynamic> extends core::Object implements col::ListBase<self::_NegativeLengthList&Object&ListMixin::E%> /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
  const synthetic constructor •() → self::_NegativeLengthList&Object&ListMixin<self::_NegativeLengthList&Object&ListMixin::E%>
    : super core::Object::•()
    ;
  @#C3
  get /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ iterator() → core::Iterator<self::_NegativeLengthList&Object&ListMixin::E%>
    return new _in::ListIterator::•<self::_NegativeLengthList&Object&ListMixin::E%>(this);
  method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ elementAt(core::int index) → self::_NegativeLengthList&Object&ListMixin::E%
    return this.{core::List::[]}(index){(core::int) → self::_NegativeLengthList&Object&ListMixin::E%};
  method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ followedBy(covariant-by-class core::Iterable<self::_NegativeLengthList&Object&ListMixin::E%> other) → core::Iterable<self::_NegativeLengthList&Object&ListMixin::E%>
    return _in::FollowedByIterable::firstEfficient<self::_NegativeLengthList&Object&ListMixin::E%>(this, other);
  method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ forEach((self::_NegativeLengthList&Object&ListMixin::E%) → void action) → void {
    core::int length = this.{core::List::length}{core::int};
    for (core::int i = 0; i.{core::num::<}(length){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int}) {
      action(this.{core::List::[]}(i){(core::int) → self::_NegativeLengthList&Object&ListMixin::E%}){(self::_NegativeLengthList&Object&ListMixin::E%) → void};
      if(!(length =={core::num::==}{(core::Object) → core::bool} this.{core::List::length}{core::int})) {
        throw new core::ConcurrentModificationError::•(this);
      }
    }
  }
  @#C3
  get /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ isEmpty() → core::bool
    return this.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} 0;
  get /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ isNotEmpty() → core::bool
    return !this.{col::ListBase::isEmpty}{core::bool};
  get /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ first() → self::_NegativeLengthList&Object&ListMixin::E% {
    if(this.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} 0)
      throw _in::IterableElementError::noElement();
    return this.{core::List::[]}(0){(core::int) → self::_NegativeLengthList&Object&ListMixin::E%};
  }
  set /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ first(covariant-by-class self::_NegativeLengthList&Object&ListMixin::E% value) → void {
    if(this.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} 0)
      throw _in::IterableElementError::noElement();
    this.{core::List::[]=}(0, value){(core::int, self::_NegativeLengthList&Object&ListMixin::E%) → void};
  }
  get /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ last() → self::_NegativeLengthList&Object&ListMixin::E% {
    if(this.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} 0)
      throw _in::IterableElementError::noElement();
    return this.{core::List::[]}(this.{core::List::length}{core::int}.{core::num::-}(1){(core::num) → core::int}){(core::int) → self::_NegativeLengthList&Object&ListMixin::E%};
  }
  set /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ last(covariant-by-class self::_NegativeLengthList&Object&ListMixin::E% value) → void {
    if(this.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} 0)
      throw _in::IterableElementError::noElement();
    this.{core::List::[]=}(this.{core::List::length}{core::int}.{core::num::-}(1){(core::num) → core::int}, value){(core::int, self::_NegativeLengthList&Object&ListMixin::E%) → void};
  }
  get /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ single() → self::_NegativeLengthList&Object&ListMixin::E% {
    if(this.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} 0)
      throw _in::IterableElementError::noElement();
    if(this.{core::List::length}{core::int}.{core::num::>}(1){(core::num) → core::bool})
      throw _in::IterableElementError::tooMany();
    return this.{core::List::[]}(0){(core::int) → self::_NegativeLengthList&Object&ListMixin::E%};
  }
  method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ contains(core::Object? element) → core::bool {
    core::int length = this.{core::List::length}{core::int};
    for (core::int i = 0; i.{core::num::<}(length){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int}) {
      if(this.{core::List::[]}(i){(core::int) → self::_NegativeLengthList&Object&ListMixin::E%} =={core::Object::==}{(core::Object) → core::bool} element)
        return true;
      if(!(length =={core::num::==}{(core::Object) → core::bool} this.{core::List::length}{core::int})) {
        throw new core::ConcurrentModificationError::•(this);
      }
    }
    return false;
  }
  method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ every((self::_NegativeLengthList&Object&ListMixin::E%) → core::bool test) → core::bool {
    core::int length = this.{core::List::length}{core::int};
    for (core::int i = 0; i.{core::num::<}(length){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int}) {
      if(!test(this.{core::List::[]}(i){(core::int) → self::_NegativeLengthList&Object&ListMixin::E%}){(self::_NegativeLengthList&Object&ListMixin::E%) → core::bool})
        return false;
      if(!(length =={core::num::==}{(core::Object) → core::bool} this.{core::List::length}{core::int})) {
        throw new core::ConcurrentModificationError::•(this);
      }
    }
    return true;
  }
  method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ any((self::_NegativeLengthList&Object&ListMixin::E%) → core::bool test) → core::bool {
    core::int length = this.{core::List::length}{core::int};
    for (core::int i = 0; i.{core::num::<}(length){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int}) {
      if(test(this.{core::List::[]}(i){(core::int) → self::_NegativeLengthList&Object&ListMixin::E%}){(self::_NegativeLengthList&Object&ListMixin::E%) → core::bool})
        return true;
      if(!(length =={core::num::==}{(core::Object) → core::bool} this.{core::List::length}{core::int})) {
        throw new core::ConcurrentModificationError::•(this);
      }
    }
    return false;
  }
  method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ firstWhere((self::_NegativeLengthList&Object&ListMixin::E%) → core::bool test, {covariant-by-class () →? self::_NegativeLengthList&Object&ListMixin::E% orElse = #C2}) → self::_NegativeLengthList&Object&ListMixin::E% {
    core::int length = this.{core::List::length}{core::int};
    for (core::int i = 0; i.{core::num::<}(length){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int}) {
      self::_NegativeLengthList&Object&ListMixin::E% element = this.{core::List::[]}(i){(core::int) → self::_NegativeLengthList&Object&ListMixin::E%};
      if(test(element){(self::_NegativeLengthList&Object&ListMixin::E%) → core::bool})
        return element;
      if(!(length =={core::num::==}{(core::Object) → core::bool} this.{core::List::length}{core::int})) {
        throw new core::ConcurrentModificationError::•(this);
      }
    }
    if(!(orElse == null))
      return orElse{() → self::_NegativeLengthList&Object&ListMixin::E%}(){() → self::_NegativeLengthList&Object&ListMixin::E%};
    throw _in::IterableElementError::noElement();
  }
  method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ lastWhere((self::_NegativeLengthList&Object&ListMixin::E%) → core::bool test, {covariant-by-class () →? self::_NegativeLengthList&Object&ListMixin::E% orElse = #C2}) → self::_NegativeLengthList&Object&ListMixin::E% {
    core::int length = this.{core::List::length}{core::int};
    for (core::int i = length.{core::num::-}(1){(core::num) → core::int}; i.{core::num::>=}(0){(core::num) → core::bool}; i = i.{core::num::-}(1){(core::num) → core::int}) {
      self::_NegativeLengthList&Object&ListMixin::E% element = this.{core::List::[]}(i){(core::int) → self::_NegativeLengthList&Object&ListMixin::E%};
      if(test(element){(self::_NegativeLengthList&Object&ListMixin::E%) → core::bool})
        return element;
      if(!(length =={core::num::==}{(core::Object) → core::bool} this.{core::List::length}{core::int})) {
        throw new core::ConcurrentModificationError::•(this);
      }
    }
    if(!(orElse == null))
      return orElse{() → self::_NegativeLengthList&Object&ListMixin::E%}(){() → self::_NegativeLengthList&Object&ListMixin::E%};
    throw _in::IterableElementError::noElement();
  }
  method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ singleWhere((self::_NegativeLengthList&Object&ListMixin::E%) → core::bool test, {covariant-by-class () →? self::_NegativeLengthList&Object&ListMixin::E% orElse = #C2}) → self::_NegativeLengthList&Object&ListMixin::E% {
    core::int length = this.{core::List::length}{core::int};
    late self::_NegativeLengthList&Object&ListMixin::E% match;
    core::bool matchFound = false;
    for (core::int i = 0; i.{core::num::<}(length){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int}) {
      self::_NegativeLengthList&Object&ListMixin::E% element = this.{core::List::[]}(i){(core::int) → self::_NegativeLengthList&Object&ListMixin::E%};
      if(test(element){(self::_NegativeLengthList&Object&ListMixin::E%) → core::bool}) {
        if(matchFound) {
          throw _in::IterableElementError::tooMany();
        }
        matchFound = true;
        match = element;
      }
      if(!(length =={core::num::==}{(core::Object) → core::bool} this.{core::List::length}{core::int})) {
        throw new core::ConcurrentModificationError::•(this);
      }
    }
    if(matchFound)
      return match;
    if(!(orElse == null))
      return orElse{() → self::_NegativeLengthList&Object&ListMixin::E%}(){() → self::_NegativeLengthList&Object&ListMixin::E%};
    throw _in::IterableElementError::noElement();
  }
  method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ join([core::String separator = #C4]) → core::String {
    if(this.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} 0)
      return "";
    core::StringBuffer buffer = let final core::StringBuffer #t1 = new core::StringBuffer::•() in block {
      #t1.{core::StringBuffer::writeAll}(this, separator){(core::Iterable<dynamic>, [core::String]) → void};
    } =>#t1;
    return buffer.{core::StringBuffer::toString}(){() → core::String};
  }
  method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ where((self::_NegativeLengthList&Object&ListMixin::E%) → core::bool test) → core::Iterable<self::_NegativeLengthList&Object&ListMixin::E%>
    return new _in::WhereIterable::•<self::_NegativeLengthList&Object&ListMixin::E%>(this, test);
  method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ whereType<T extends core::Object? = dynamic>() → core::Iterable<self::_NegativeLengthList&Object&ListMixin::whereType::T%>
    return new _in::WhereTypeIterable::•<self::_NegativeLengthList&Object&ListMixin::whereType::T%>(this);
  method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ map<T extends core::Object? = dynamic>((self::_NegativeLengthList&Object&ListMixin::E%) → self::_NegativeLengthList&Object&ListMixin::map::T% f) → core::Iterable<self::_NegativeLengthList&Object&ListMixin::map::T%>
    return new _in::MappedListIterable::•<self::_NegativeLengthList&Object&ListMixin::E%, self::_NegativeLengthList&Object&ListMixin::map::T%>(this, f);
  method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ expand<T extends core::Object? = dynamic>((self::_NegativeLengthList&Object&ListMixin::E%) → core::Iterable<self::_NegativeLengthList&Object&ListMixin::expand::T%> f) → core::Iterable<self::_NegativeLengthList&Object&ListMixin::expand::T%>
    return new _in::ExpandIterable::•<self::_NegativeLengthList&Object&ListMixin::E%, self::_NegativeLengthList&Object&ListMixin::expand::T%>(this, f);
  method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ reduce(covariant-by-class (self::_NegativeLengthList&Object&ListMixin::E%, self::_NegativeLengthList&Object&ListMixin::E%) → self::_NegativeLengthList&Object&ListMixin::E% combine) → self::_NegativeLengthList&Object&ListMixin::E% {
    core::int length = this.{core::List::length}{core::int};
    if(length =={core::num::==}{(core::Object) → core::bool} 0)
      throw _in::IterableElementError::noElement();
    self::_NegativeLengthList&Object&ListMixin::E% value = this.{core::List::[]}(0){(core::int) → self::_NegativeLengthList&Object&ListMixin::E%};
    for (core::int i = 1; i.{core::num::<}(length){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int}) {
      value = combine(value, this.{core::List::[]}(i){(core::int) → self::_NegativeLengthList&Object&ListMixin::E%}){(self::_NegativeLengthList&Object&ListMixin::E%, self::_NegativeLengthList&Object&ListMixin::E%) → self::_NegativeLengthList&Object&ListMixin::E%};
      if(!(length =={core::num::==}{(core::Object) → core::bool} this.{core::List::length}{core::int})) {
        throw new core::ConcurrentModificationError::•(this);
      }
    }
    return value;
  }
  method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ fold<T extends core::Object? = dynamic>(self::_NegativeLengthList&Object&ListMixin::fold::T% initialValue, (self::_NegativeLengthList&Object&ListMixin::fold::T%, self::_NegativeLengthList&Object&ListMixin::E%) → self::_NegativeLengthList&Object&ListMixin::fold::T% combine) → self::_NegativeLengthList&Object&ListMixin::fold::T% {
    self::_NegativeLengthList&Object&ListMixin::fold::T% value = initialValue;
    core::int length = this.{core::List::length}{core::int};
    for (core::int i = 0; i.{core::num::<}(length){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int}) {
      value = combine(value, this.{core::List::[]}(i){(core::int) → self::_NegativeLengthList&Object&ListMixin::E%}){(self::_NegativeLengthList&Object&ListMixin::fold::T%, self::_NegativeLengthList&Object&ListMixin::E%) → self::_NegativeLengthList&Object&ListMixin::fold::T%};
      if(!(length =={core::num::==}{(core::Object) → core::bool} this.{core::List::length}{core::int})) {
        throw new core::ConcurrentModificationError::•(this);
      }
    }
    return value;
  }
  method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ skip(core::int count) → core::Iterable<self::_NegativeLengthList&Object&ListMixin::E%>
    return new _in::SubListIterable::•<self::_NegativeLengthList&Object&ListMixin::E%>(this, count, null);
  method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ skipWhile((self::_NegativeLengthList&Object&ListMixin::E%) → core::bool test) → core::Iterable<self::_NegativeLengthList&Object&ListMixin::E%> {
    return new _in::SkipWhileIterable::•<self::_NegativeLengthList&Object&ListMixin::E%>(this, test);
  }
  method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ take(core::int count) → core::Iterable<self::_NegativeLengthList&Object&ListMixin::E%>
    return new _in::SubListIterable::•<self::_NegativeLengthList&Object&ListMixin::E%>(this, 0, _in::checkNotNullable<core::int>(count, "count"));
  method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ takeWhile((self::_NegativeLengthList&Object&ListMixin::E%) → core::bool test) → core::Iterable<self::_NegativeLengthList&Object&ListMixin::E%> {
    return new _in::TakeWhileIterable::•<self::_NegativeLengthList&Object&ListMixin::E%>(this, test);
  }
  method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ toList({core::bool growable = #C5}) → core::List<self::_NegativeLengthList&Object&ListMixin::E%> {
    if(this.{col::ListBase::isEmpty}{core::bool})
      return core::List::empty<self::_NegativeLengthList&Object&ListMixin::E%>(growable: growable);
    self::_NegativeLengthList&Object&ListMixin::E% first = this.{core::List::[]}(0){(core::int) → self::_NegativeLengthList&Object&ListMixin::E%};
    core::List<self::_NegativeLengthList&Object&ListMixin::E%> result = core::List::filled<self::_NegativeLengthList&Object&ListMixin::E%>(this.{core::List::length}{core::int}, first, growable: growable);
    for (core::int i = 1; i.{core::num::<}(this.{core::List::length}{core::int}){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int}) {
      result.{core::List::[]=}(i, this.{core::List::[]}(i){(core::int) → self::_NegativeLengthList&Object&ListMixin::E%}){(core::int, self::_NegativeLengthList&Object&ListMixin::E%) → void};
    }
    return result;
  }
  method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ toSet() → core::Set<self::_NegativeLengthList&Object&ListMixin::E%> {
    core::Set<self::_NegativeLengthList&Object&ListMixin::E%> result = new _co::_Set::•<self::_NegativeLengthList&Object&ListMixin::E%>();
    for (core::int i = 0; i.{core::num::<}(this.{core::List::length}{core::int}){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int}) {
      result.{core::Set::add}(this.{core::List::[]}(i){(core::int) → self::_NegativeLengthList&Object&ListMixin::E%}){(self::_NegativeLengthList&Object&ListMixin::E%) → core::bool};
    }
    return result;
  }
  method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ add(covariant-by-class self::_NegativeLengthList&Object&ListMixin::E% element) → void {
    this.{core::List::[]=}(let final core::int #t2 = this.{core::List::length}{core::int} in let final void #t3 = this.{core::List::length} = #t2.{core::num::+}(1){(core::num) → core::int} in #t2, element){(core::int, self::_NegativeLengthList&Object&ListMixin::E%) → void};
  }
  method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ addAll(covariant-by-class core::Iterable<self::_NegativeLengthList&Object&ListMixin::E%> iterable) → void {
    core::int i = this.{core::List::length}{core::int};
    {
      synthesized core::Iterator<self::_NegativeLengthList&Object&ListMixin::E%> :sync-for-iterator = iterable.{core::Iterable::iterator}{core::Iterator<self::_NegativeLengthList&Object&ListMixin::E%>};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
        self::_NegativeLengthList&Object&ListMixin::E% element = :sync-for-iterator.{core::Iterator::current}{self::_NegativeLengthList&Object&ListMixin::E%};
        {
          assert(this.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} i || (throw new core::ConcurrentModificationError::•(this)));
          this.{col::ListBase::add}(element){(self::_NegativeLengthList&Object&ListMixin::E%) → void};
          i = i.{core::num::+}(1){(core::num) → core::int};
        }
      }
    }
  }
  method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ remove(core::Object? element) → core::bool {
    for (core::int i = 0; i.{core::num::<}(this.{core::List::length}{core::int}){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int}) {
      if(this.{core::List::[]}(i){(core::int) → self::_NegativeLengthList&Object&ListMixin::E%} =={core::Object::==}{(core::Object) → core::bool} element) {
        this.{col::ListBase::_closeGap}(i, i.{core::num::+}(1){(core::num) → core::int}){(core::int, core::int) → void};
        return true;
      }
    }
    return false;
  }
  method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ col::_closeGap(core::int start, core::int end) → void {
    core::int length = this.{core::List::length}{core::int};
    assert(0.{core::num::<=}(start){(core::num) → core::bool});
    assert(start.{core::num::<}(end){(core::num) → core::bool});
    assert(end.{core::num::<=}(length){(core::num) → core::bool});
    core::int size = end.{core::num::-}(start){(core::num) → core::int};
    for (core::int i = end; i.{core::num::<}(length){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int}) {
      this.{core::List::[]=}(i.{core::num::-}(size){(core::num) → core::int}, this.{core::List::[]}(i){(core::int) → self::_NegativeLengthList&Object&ListMixin::E%}){(core::int, self::_NegativeLengthList&Object&ListMixin::E%) → void};
    }
    this.{core::List::length} = length.{core::num::-}(size){(core::num) → core::int};
  }
  method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ removeWhere((self::_NegativeLengthList&Object&ListMixin::E%) → core::bool test) → void {
    this.{col::ListBase::_filter}(test, false){((self::_NegativeLengthList&Object&ListMixin::E%) → core::bool, core::bool) → void};
  }
  method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ retainWhere((self::_NegativeLengthList&Object&ListMixin::E%) → core::bool test) → void {
    this.{col::ListBase::_filter}(test, true){((self::_NegativeLengthList&Object&ListMixin::E%) → core::bool, core::bool) → void};
  }
  method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ col::_filter((self::_NegativeLengthList&Object&ListMixin::E%) → core::bool test, core::bool retainMatching) → void {
    core::List<self::_NegativeLengthList&Object&ListMixin::E%> retained = core::_GrowableList::•<self::_NegativeLengthList&Object&ListMixin::E%>(0);
    core::int length = this.{core::List::length}{core::int};
    for (core::int i = 0; i.{core::num::<}(length){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int}) {
      self::_NegativeLengthList&Object&ListMixin::E% element = this.{core::List::[]}(i){(core::int) → self::_NegativeLengthList&Object&ListMixin::E%};
      if(test(element){(self::_NegativeLengthList&Object&ListMixin::E%) → core::bool} =={core::Object::==}{(core::Object) → core::bool} retainMatching) {
        retained.{core::List::add}(element){(self::_NegativeLengthList&Object&ListMixin::E%) → void};
      }
      if(!(length =={core::num::==}{(core::Object) → core::bool} this.{core::List::length}{core::int})) {
        throw new core::ConcurrentModificationError::•(this);
      }
    }
    if(!(retained.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} this.{core::List::length}{core::int})) {
      this.{col::ListBase::setRange}(0, retained.{core::List::length}{core::int}, retained){(core::int, core::int, core::Iterable<self::_NegativeLengthList&Object&ListMixin::E%>, [core::int]) → void};
      this.{core::List::length} = retained.{core::List::length}{core::int};
    }
  }
  method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ clear() → void {
    this.{core::List::length} = 0;
  }
  method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ cast<R extends core::Object? = dynamic>() → core::List<self::_NegativeLengthList&Object&ListMixin::cast::R%>
    return core::List::castFrom<self::_NegativeLengthList&Object&ListMixin::E%, self::_NegativeLengthList&Object&ListMixin::cast::R%>(this);
  method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ removeLast() → self::_NegativeLengthList&Object&ListMixin::E% {
    if(this.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} 0) {
      throw _in::IterableElementError::noElement();
    }
    self::_NegativeLengthList&Object&ListMixin::E% result = this.{core::List::[]}(this.{core::List::length}{core::int}.{core::num::-}(1){(core::num) → core::int}){(core::int) → self::_NegativeLengthList&Object&ListMixin::E%};
    this.{core::List::length} = this.{core::List::length}{core::int}.{core::num::-}(1){(core::num) → core::int};
    return result;
  }
  method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ sort([(self::_NegativeLengthList&Object&ListMixin::E%, self::_NegativeLengthList&Object&ListMixin::E%) →? core::int compare = #C2]) → void {
    _in::Sort::sort<self::_NegativeLengthList&Object&ListMixin::E%>(this, let final (self::_NegativeLengthList&Object&ListMixin::E%, self::_NegativeLengthList&Object&ListMixin::E%) →? core::int #t4 = compare in #t4 == null ?{(self::_NegativeLengthList&Object&ListMixin::E%, self::_NegativeLengthList&Object&ListMixin::E%) → core::int} #C6 : #t4{(self::_NegativeLengthList&Object&ListMixin::E%, self::_NegativeLengthList&Object&ListMixin::E%) → core::int});
  }
  method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ shuffle([math::Random? random = #C2]) → void {
    random == null ?{math::Random?} random = math::Random::•() : null;
    core::int length = this.{core::List::length}{core::int};
    while (length.{core::num::>}(1){(core::num) → core::bool}) {
      core::int pos = random{math::Random}.{math::Random::nextInt}(length){(core::int) → core::int};
      length = length.{core::num::-}(1){(core::num) → core::int};
      self::_NegativeLengthList&Object&ListMixin::E% tmp = this.{core::List::[]}(length){(core::int) → self::_NegativeLengthList&Object&ListMixin::E%};
      this.{core::List::[]=}(length, this.{core::List::[]}(pos){(core::int) → self::_NegativeLengthList&Object&ListMixin::E%}){(core::int, self::_NegativeLengthList&Object&ListMixin::E%) → void};
      this.{core::List::[]=}(pos, tmp){(core::int, self::_NegativeLengthList&Object&ListMixin::E%) → void};
    }
  }
  method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ asMap() → core::Map<core::int, self::_NegativeLengthList&Object&ListMixin::E%> {
    return new _in::ListMapView::•<self::_NegativeLengthList&Object&ListMixin::E%>(this);
  }
  operator /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ +(covariant-by-class core::List<self::_NegativeLengthList&Object&ListMixin::E%> other) → core::List<self::_NegativeLengthList&Object&ListMixin::E%>
    return block {
      final core::List<self::_NegativeLengthList&Object&ListMixin::E%> #t5 = core::List::of<self::_NegativeLengthList&Object&ListMixin::E%>(this);
      #t5.{core::List::addAll}{Invariant}(other){(core::Iterable<self::_NegativeLengthList&Object&ListMixin::E%>) → void};
    } =>#t5;
  method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ sublist(core::int start, [core::int? end = #C2]) → core::List<self::_NegativeLengthList&Object&ListMixin::E%> {
    core::int listLength = this.{core::List::length}{core::int};
    end == null ?{core::int?} end = listLength : null;
    core::RangeError::checkValidRange(start, end{core::int}, listLength);
    return core::List::of<self::_NegativeLengthList&Object&ListMixin::E%>(this.{col::ListBase::getRange}(start, end{core::int}){(core::int, core::int) → core::Iterable<self::_NegativeLengthList&Object&ListMixin::E%>});
  }
  method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ getRange(core::int start, core::int end) → core::Iterable<self::_NegativeLengthList&Object&ListMixin::E%> {
    core::RangeError::checkValidRange(start, end, this.{core::List::length}{core::int});
    return new _in::SubListIterable::•<self::_NegativeLengthList&Object&ListMixin::E%>(this, start, end);
  }
  method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ removeRange(core::int start, core::int end) → void {
    core::RangeError::checkValidRange(start, end, this.{core::List::length}{core::int});
    if(end.{core::num::>}(start){(core::num) → core::bool}) {
      this.{col::ListBase::_closeGap}(start, end){(core::int, core::int) → void};
    }
  }
  method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ fillRange(core::int start, core::int end, [covariant-by-class self::_NegativeLengthList&Object&ListMixin::E? fill = #C2]) → void {
    self::_NegativeLengthList&Object&ListMixin::E% value = let self::_NegativeLengthList&Object&ListMixin::E? #t6 = fill in #t6 == null ?{self::_NegativeLengthList&Object&ListMixin::E%} let self::_NegativeLengthList&Object&ListMixin::E? #t7 = #t6 in #t7 == null ?{self::_NegativeLengthList&Object&ListMixin::E%} #t7 as self::_NegativeLengthList&Object&ListMixin::E% : #t7{self::_NegativeLengthList&Object&ListMixin::E%} : #t6{self::_NegativeLengthList&Object&ListMixin::E%};
    core::RangeError::checkValidRange(start, end, this.{core::List::length}{core::int});
    for (core::int i = start; i.{core::num::<}(end){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int}) {
      this.{core::List::[]=}(i, value){(core::int, self::_NegativeLengthList&Object&ListMixin::E%) → void};
    }
  }
  method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ setRange(core::int start, core::int end, covariant-by-class core::Iterable<self::_NegativeLengthList&Object&ListMixin::E%> iterable, [core::int skipCount = #C7]) → void {
    core::RangeError::checkValidRange(start, end, this.{core::List::length}{core::int});
    core::int length = end.{core::num::-}(start){(core::num) → core::int};
    if(length =={core::num::==}{(core::Object) → core::bool} 0)
      return;
    core::RangeError::checkNotNegative(skipCount, "skipCount");
    core::List<self::_NegativeLengthList&Object&ListMixin::E%> otherList;
    core::int otherStart;
    if(iterable is core::List<self::_NegativeLengthList&Object&ListMixin::E%>) {
      otherList = iterable{core::List<self::_NegativeLengthList&Object&ListMixin::E%>};
      otherStart = skipCount;
    }
    else {
      otherList = iterable.{core::Iterable::skip}(skipCount){(core::int) → core::Iterable<self::_NegativeLengthList&Object&ListMixin::E%>}.{core::Iterable::toList}(growable: false){({growable: core::bool}) → core::List<self::_NegativeLengthList&Object&ListMixin::E%>};
      otherStart = 0;
    }
    if(otherStart.{core::num::+}(length){(core::num) → core::int}.{core::num::>}(otherList.{core::List::length}{core::int}){(core::num) → core::bool}) {
      throw _in::IterableElementError::tooFew();
    }
    if(otherStart.{core::num::<}(start){(core::num) → core::bool}) {
      for (core::int i = length.{core::num::-}(1){(core::num) → core::int}; i.{core::num::>=}(0){(core::num) → core::bool}; i = i.{core::num::-}(1){(core::num) → core::int}) {
        this.{core::List::[]=}(start.{core::num::+}(i){(core::num) → core::int}, otherList.{core::List::[]}(otherStart.{core::num::+}(i){(core::num) → core::int}){(core::int) → self::_NegativeLengthList&Object&ListMixin::E%}){(core::int, self::_NegativeLengthList&Object&ListMixin::E%) → void};
      }
    }
    else {
      for (core::int i = 0; i.{core::num::<}(length){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int}) {
        this.{core::List::[]=}(start.{core::num::+}(i){(core::num) → core::int}, otherList.{core::List::[]}(otherStart.{core::num::+}(i){(core::num) → core::int}){(core::int) → self::_NegativeLengthList&Object&ListMixin::E%}){(core::int, self::_NegativeLengthList&Object&ListMixin::E%) → void};
      }
    }
  }
  method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ replaceRange(core::int start, core::int end, covariant-by-class core::Iterable<self::_NegativeLengthList&Object&ListMixin::E%> newContents) → void {
    core::RangeError::checkValidRange(start, end, this.{core::List::length}{core::int});
    if(start =={core::num::==}{(core::Object) → core::bool} this.{core::List::length}{core::int}) {
      this.{col::ListBase::addAll}(newContents){(core::Iterable<self::_NegativeLengthList&Object&ListMixin::E%>) → void};
      return;
    }
    if(!(newContents is _in::EfficientLengthIterable<dynamic>)) {
      newContents = newContents.{core::Iterable::toList}(){({growable: core::bool}) → core::List<self::_NegativeLengthList&Object&ListMixin::E%>};
    }
    core::int removeLength = end.{core::num::-}(start){(core::num) → core::int};
    core::int insertLength = newContents.{core::Iterable::length}{core::int};
    if(removeLength.{core::num::>=}(insertLength){(core::num) → core::bool}) {
      core::int insertEnd = start.{core::num::+}(insertLength){(core::num) → core::int};
      this.{col::ListBase::setRange}(start, insertEnd, newContents){(core::int, core::int, core::Iterable<self::_NegativeLengthList&Object&ListMixin::E%>, [core::int]) → void};
      if(removeLength.{core::num::>}(insertLength){(core::num) → core::bool}) {
        this.{col::ListBase::_closeGap}(insertEnd, end){(core::int, core::int) → void};
      }
    }
    else
      if(end =={core::num::==}{(core::Object) → core::bool} this.{core::List::length}{core::int}) {
        core::int i = start;
        {
          synthesized core::Iterator<self::_NegativeLengthList&Object&ListMixin::E%> :sync-for-iterator = newContents.{core::Iterable::iterator}{core::Iterator<self::_NegativeLengthList&Object&ListMixin::E%>};
          for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
            self::_NegativeLengthList&Object&ListMixin::E% element = :sync-for-iterator.{core::Iterator::current}{self::_NegativeLengthList&Object&ListMixin::E%};
            {
              if(i.{core::num::<}(end){(core::num) → core::bool}) {
                this.{core::List::[]=}(i, element){(core::int, self::_NegativeLengthList&Object&ListMixin::E%) → void};
              }
              else {
                this.{col::ListBase::add}(element){(self::_NegativeLengthList&Object&ListMixin::E%) → void};
              }
              i = i.{core::num::+}(1){(core::num) → core::int};
            }
          }
        }
      }
      else {
        core::int delta = insertLength.{core::num::-}(removeLength){(core::num) → core::int};
        core::int oldLength = this.{core::List::length}{core::int};
        core::int insertEnd = start.{core::num::+}(insertLength){(core::num) → core::int};
        for (core::int i = oldLength.{core::num::-}(delta){(core::num) → core::int}; i.{core::num::<}(oldLength){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int}) {
          this.{col::ListBase::add}(this.{core::List::[]}(i.{core::num::>}(0){(core::num) → core::bool} ?{core::int} i : 0){(core::int) → self::_NegativeLengthList&Object&ListMixin::E%}){(self::_NegativeLengthList&Object&ListMixin::E%) → void};
        }
        if(insertEnd.{core::num::<}(oldLength){(core::num) → core::bool}) {
          this.{col::ListBase::setRange}(insertEnd, oldLength, this, end){(core::int, core::int, core::Iterable<self::_NegativeLengthList&Object&ListMixin::E%>, [core::int]) → void};
        }
        this.{col::ListBase::setRange}(start, insertEnd, newContents){(core::int, core::int, core::Iterable<self::_NegativeLengthList&Object&ListMixin::E%>, [core::int]) → void};
      }
  }
  method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ indexOf(covariant-by-class core::Object? element, [core::int start = #C7]) → core::int {
    if(start.{core::num::<}(0){(core::num) → core::bool})
      start = 0;
    for (core::int i = start; i.{core::num::<}(this.{core::List::length}{core::int}){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int}) {
      if(this.{core::List::[]}(i){(core::int) → self::_NegativeLengthList&Object&ListMixin::E%} =={core::Object::==}{(core::Object) → core::bool} element)
        return i;
    }
    return 1.{core::int::unary-}(){() → core::int};
  }
  method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ indexWhere((self::_NegativeLengthList&Object&ListMixin::E%) → core::bool test, [core::int start = #C7]) → core::int {
    if(start.{core::num::<}(0){(core::num) → core::bool})
      start = 0;
    for (core::int i = start; i.{core::num::<}(this.{core::List::length}{core::int}){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int}) {
      if(test(this.{core::List::[]}(i){(core::int) → self::_NegativeLengthList&Object&ListMixin::E%}){(self::_NegativeLengthList&Object&ListMixin::E%) → core::bool})
        return i;
    }
    return 1.{core::int::unary-}(){() → core::int};
  }
  method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ lastIndexOf(covariant-by-class core::Object? element, [core::int? start = #C2]) → core::int {
    if(start == null || start{core::int}.{core::num::>=}(this.{core::List::length}{core::int}){(core::num) → core::bool})
      start = this.{core::List::length}{core::int}.{core::num::-}(1){(core::num) → core::int};
    for (core::int i = start{core::int}; i.{core::num::>=}(0){(core::num) → core::bool}; i = i.{core::num::-}(1){(core::num) → core::int}) {
      if(this.{core::List::[]}(i){(core::int) → self::_NegativeLengthList&Object&ListMixin::E%} =={core::Object::==}{(core::Object) → core::bool} element)
        return i;
    }
    return 1.{core::int::unary-}(){() → core::int};
  }
  method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ lastIndexWhere((self::_NegativeLengthList&Object&ListMixin::E%) → core::bool test, [core::int? start = #C2]) → core::int {
    if(start == null || start{core::int}.{core::num::>=}(this.{core::List::length}{core::int}){(core::num) → core::bool})
      start = this.{core::List::length}{core::int}.{core::num::-}(1){(core::num) → core::int};
    for (core::int i = start{core::int}; i.{core::num::>=}(0){(core::num) → core::bool}; i = i.{core::num::-}(1){(core::num) → core::int}) {
      if(test(this.{core::List::[]}(i){(core::int) → self::_NegativeLengthList&Object&ListMixin::E%}){(self::_NegativeLengthList&Object&ListMixin::E%) → core::bool})
        return i;
    }
    return 1.{core::int::unary-}(){() → core::int};
  }
  method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ insert(core::int index, covariant-by-class self::_NegativeLengthList&Object&ListMixin::E% element) → void {
    _in::checkNotNullable<core::int>(index, "index");
    core::int length = this.{core::List::length}{core::int};
    core::RangeError::checkValueInInterval(index, 0, length, "index");
    this.{col::ListBase::add}(element){(self::_NegativeLengthList&Object&ListMixin::E%) → void};
    if(!(index =={core::num::==}{(core::Object) → core::bool} length)) {
      this.{col::ListBase::setRange}(index.{core::num::+}(1){(core::num) → core::int}, length.{core::num::+}(1){(core::num) → core::int}, this, index){(core::int, core::int, core::Iterable<self::_NegativeLengthList&Object&ListMixin::E%>, [core::int]) → void};
      this.{core::List::[]=}(index, element){(core::int, self::_NegativeLengthList&Object&ListMixin::E%) → void};
    }
  }
  method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ removeAt(core::int index) → self::_NegativeLengthList&Object&ListMixin::E% {
    self::_NegativeLengthList&Object&ListMixin::E% result = this.{core::List::[]}(index){(core::int) → self::_NegativeLengthList&Object&ListMixin::E%};
    this.{col::ListBase::_closeGap}(index, index.{core::num::+}(1){(core::num) → core::int}){(core::int, core::int) → void};
    return result;
  }
  method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ insertAll(core::int index, covariant-by-class core::Iterable<self::_NegativeLengthList&Object&ListMixin::E%> iterable) → void {
    core::RangeError::checkValueInInterval(index, 0, this.{core::List::length}{core::int}, "index");
    if(index =={core::num::==}{(core::Object) → core::bool} this.{core::List::length}{core::int}) {
      this.{col::ListBase::addAll}(iterable){(core::Iterable<self::_NegativeLengthList&Object&ListMixin::E%>) → void};
      return;
    }
    if(!(iterable is _in::EfficientLengthIterable<dynamic>) || core::identical(iterable, this)) {
      iterable = iterable.{core::Iterable::toList}(){({growable: core::bool}) → core::List<self::_NegativeLengthList&Object&ListMixin::E%>};
    }
    core::int insertionLength = iterable.{core::Iterable::length}{core::int};
    if(insertionLength =={core::num::==}{(core::Object) → core::bool} 0) {
      return;
    }
    core::int oldLength = this.{core::List::length}{core::int};
    for (core::int i = oldLength.{core::num::-}(insertionLength){(core::num) → core::int}; i.{core::num::<}(oldLength){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int}) {
      this.{col::ListBase::add}(this.{core::List::[]}(i.{core::num::>}(0){(core::num) → core::bool} ?{core::int} i : 0){(core::int) → self::_NegativeLengthList&Object&ListMixin::E%}){(self::_NegativeLengthList&Object&ListMixin::E%) → void};
    }
    if(!(iterable.{core::Iterable::length}{core::int} =={core::num::==}{(core::Object) → core::bool} insertionLength)) {
      this.{core::List::length} = this.{core::List::length}{core::int}.{core::num::-}(insertionLength){(core::num) → core::int};
      throw new core::ConcurrentModificationError::•(iterable);
    }
    core::int oldCopyStart = index.{core::num::+}(insertionLength){(core::num) → core::int};
    if(oldCopyStart.{core::num::<}(oldLength){(core::num) → core::bool}) {
      this.{col::ListBase::setRange}(oldCopyStart, oldLength, this, index){(core::int, core::int, core::Iterable<self::_NegativeLengthList&Object&ListMixin::E%>, [core::int]) → void};
    }
    this.{col::ListBase::setAll}(index, iterable){(core::int, core::Iterable<self::_NegativeLengthList&Object&ListMixin::E%>) → void};
  }
  method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ setAll(core::int index, covariant-by-class core::Iterable<self::_NegativeLengthList&Object&ListMixin::E%> iterable) → void {
    if(iterable is core::List<dynamic>) {
      this.{col::ListBase::setRange}(index, index.{core::num::+}(iterable.{core::Iterable::length}{core::int}){(core::num) → core::int}, iterable){(core::int, core::int, core::Iterable<self::_NegativeLengthList&Object&ListMixin::E%>, [core::int]) → void};
    }
    else {
      {
        synthesized core::Iterator<self::_NegativeLengthList&Object&ListMixin::E%> :sync-for-iterator = iterable.{core::Iterable::iterator}{core::Iterator<self::_NegativeLengthList&Object&ListMixin::E%>};
        for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
          self::_NegativeLengthList&Object&ListMixin::E% element = :sync-for-iterator.{core::Iterator::current}{self::_NegativeLengthList&Object&ListMixin::E%};
          {
            this.{core::List::[]=}(let final core::int #t8 = index in let final void #t9 = index = #t8.{core::num::+}(1){(core::num) → core::int} in #t8, element){(core::int, self::_NegativeLengthList&Object&ListMixin::E%) → void};
          }
        }
      }
    }
  }
  get /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ reversed() → core::Iterable<self::_NegativeLengthList&Object&ListMixin::E%>
    return new _in::ReversedListIterable::•<self::_NegativeLengthList&Object&ListMixin::E%>(this);
  method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ toString() → core::String
    return col::ListBase::listToString(this);
}
static method switchList(core::List<core::int> list) → core::int
  return block {
    core::int #t10;
    final synthesized core::List<core::int> #0#0 = list;
    synthesized core::int #0#1;
    synthesized core::bool #0#1#isSet = false;
    final const synthesized core::int #0#2 = #C8;
    final const synthesized core::int #0#6 = #C9;
    final const synthesized core::int #0#8 = #C7;
    #L1:
    {
      {
        if((#0#1#isSet ?{core::int} #0#1 : let final dynamic #t11 = #0#1#isSet = true in #0#1 = #0#0.{core::List::length}{core::int}).{core::num::>=}(#C8){(core::num) → core::bool}) {
          #t10 = 2;
          break #L1;
        }
      }
      {
        if((#0#1#isSet ?{core::int} #0#1 : let final dynamic #t12 = #0#1#isSet = true in #0#1 = #0#0.{core::List::length}{core::int}) =={core::num::==}{(core::Object) → core::bool} #C9) {
          #t10 = 1;
          break #L1;
        }
      }
      {
        if((#0#1#isSet ?{core::int} #0#1 : let final dynamic #t13 = #0#1#isSet = true in #0#1 = #0#0.{core::List::length}{core::int}).{core::num::<=}(#C7){(core::num) → core::bool}) {
          #t10 = 0;
          break #L1;
        }
      }
    }
  } =>#t10;
static method main() → dynamic {
  self::expect(0, self::switchList(core::_GrowableList::•<core::int>(0)));
  self::expect(1, self::switchList(core::_GrowableList::_literal1<core::int>(0)));
  self::expect(2, self::switchList(core::_GrowableList::_literal2<core::int>(0, 1)));
  self::expect(0, self::switchList(new self::NegativeLengthList::•<core::int>(core::_GrowableList::•<core::int>(0))));
  self::expect(1, self::switchList(new self::NegativeLengthList::•<core::int>(core::_GrowableList::_literal1<core::int>(0))));
  self::expect(2, self::switchList(new self::NegativeLengthList::•<core::int>(core::_GrowableList::_literal2<core::int>(0, 1))));
}
static method expect(dynamic expected, dynamic actual) → dynamic {
  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
    throw "Expected ${expected}, actual ${actual}";
}

constants  {
  #C1 = "vm:prefer-inline"
  #C2 = null
  #C3 = core::pragma {name:#C1, options:#C2}
  #C4 = ""
  #C5 = true
  #C6 = static-tearoff col::ListBase::_compareAny
  #C7 = 0
  #C8 = 2
  #C9 = 1
}

Extra constant evaluation status:
Evaluated: InstanceInvocation @ org-dartlang-testcase:///negative_length.dart:12:41 -> IntConstant(-1)
Evaluated: InstanceInvocation @ org-dartlang-sdk:///sdk/lib/collection/list.dart:454:12 -> IntConstant(-1)
Evaluated: InstanceInvocation @ org-dartlang-sdk:///sdk/lib/collection/list.dart:462:12 -> IntConstant(-1)
Evaluated: InstanceInvocation @ org-dartlang-sdk:///sdk/lib/collection/list.dart:471:12 -> IntConstant(-1)
Evaluated: InstanceInvocation @ org-dartlang-sdk:///sdk/lib/collection/list.dart:480:12 -> IntConstant(-1)
Extra constant evaluation: evaluated: 1121, effectively constant: 5
