library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
import "dart:collection" as col;
import "dart:_internal" as _in;

static method useAddAll() → void {
  dynamic dynamicSet1 = block {
    final core::Set<core::int> #t1 = new col::_CompactLinkedHashSet::•<core::int>();
    #t1.{core::Set::add}(0){(core::int) → core::bool};
    #t1.{core::Set::add}(1){(core::int) → core::bool};
    #t1.{core::Set::add}(2){(core::int) → core::bool};
  } =>#t1;
  dynamic dynamicSet2 = block {
    final core::Set<core::num> #t2 = new col::_CompactLinkedHashSet::•<core::num>();
    #t2.{core::Set::add}(3){(core::num) → core::bool};
    #t2.{core::Set::add}(4){(core::num) → core::bool};
    #t2.{core::Set::add}(5){(core::num) → core::bool};
  } =>#t2;
  dynamic dynamicSet3 = block {
    final core::Set<core::int?> #t3 = new col::_CompactLinkedHashSet::•<core::int?>();
    #t3.{core::Set::add}(6){(core::int?) → core::bool};
    #t3.{core::Set::add}(7){(core::int?) → core::bool};
    #t3.{core::Set::add}(8){(core::int?) → core::bool};
  } =>#t3;
  core::Iterable<core::int> iterableIntSet = block {
    final core::Set<core::int> #t4 = new col::_CompactLinkedHashSet::•<core::int>();
    #t4.{core::Set::add}(9){(core::int) → core::bool};
    #t4.{core::Set::add}(10){(core::int) → core::bool};
    #t4.{core::Set::add}(11){(core::int) → core::bool};
  } =>#t4;
  core::Set<core::int> intSet = block {
    final core::Set<core::int> #t5 = new col::_CompactLinkedHashSet::•<core::int>();
    #t5.{core::Set::add}(12){(core::int) → core::bool};
    #t5.{core::Set::add}(13){(core::int) → core::bool};
    #t5.{core::Set::add}(14){(core::int) → core::bool};
  } =>#t5;
  core::Set<core::int> set1 = block {
    final core::Set<core::int> #t6 = new col::_CompactLinkedHashSet::•<core::int>();
    {
      core::Iterator<dynamic> :sync-for-iterator = (dynamicSet1 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>).{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final dynamic #t7 = :sync-for-iterator.{core::Iterator::current};
        {
          final core::int #t8 = #t7 as{TypeError,ForNonNullableByDefault} core::int;
          #t6.{core::Set::add}(#t8){(core::int) → core::bool};
        }
      }
    }
    {
      core::Iterator<dynamic> :sync-for-iterator = (dynamicSet2 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>).{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final dynamic #t9 = :sync-for-iterator.{core::Iterator::current};
        {
          final core::int #t10 = #t9 as{TypeError,ForNonNullableByDefault} core::int;
          #t6.{core::Set::add}(#t10){(core::int) → core::bool};
        }
      }
    }
    {
      core::Iterator<dynamic> :sync-for-iterator = (dynamicSet3 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>).{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final dynamic #t11 = :sync-for-iterator.{core::Iterator::current};
        {
          final core::int #t12 = #t11 as{TypeError,ForNonNullableByDefault} core::int;
          #t6.{core::Set::add}(#t12){(core::int) → core::bool};
        }
      }
    }
    #t6.{core::Set::addAll}(iterableIntSet){(core::Iterable<core::int>) → void};
    #t6.{core::Set::addAll}(intSet){(core::Iterable<core::int>) → void};
  } =>#t6;
  self::expect(core::_GrowableList::generate<core::int>(15, (core::int i) → core::int => i).{core::Iterable::toSet}(){() → core::Set<core::int>}, set1);
  core::Set<core::num> set2 = block {
    final core::Set<core::num> #t13 = new col::_CompactLinkedHashSet::•<core::num>();
    {
      core::Iterator<dynamic> :sync-for-iterator = (dynamicSet1 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>).{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final dynamic #t14 = :sync-for-iterator.{core::Iterator::current};
        {
          final core::num #t15 = #t14 as{TypeError,ForNonNullableByDefault} core::num;
          #t13.{core::Set::add}(#t15){(core::num) → core::bool};
        }
      }
    }
    {
      core::Iterator<dynamic> :sync-for-iterator = (dynamicSet2 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>).{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final dynamic #t16 = :sync-for-iterator.{core::Iterator::current};
        {
          final core::num #t17 = #t16 as{TypeError,ForNonNullableByDefault} core::num;
          #t13.{core::Set::add}(#t17){(core::num) → core::bool};
        }
      }
    }
    {
      core::Iterator<dynamic> :sync-for-iterator = (dynamicSet3 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>).{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final dynamic #t18 = :sync-for-iterator.{core::Iterator::current};
        {
          final core::num #t19 = #t18 as{TypeError,ForNonNullableByDefault} core::num;
          #t13.{core::Set::add}(#t19){(core::num) → core::bool};
        }
      }
    }
    #t13.{core::Set::addAll}(iterableIntSet){(core::Iterable<core::num>) → void};
    #t13.{core::Set::addAll}(intSet){(core::Iterable<core::num>) → void};
  } =>#t13;
  self::expect(core::_GrowableList::generate<core::num>(15, (core::int i) → core::int => i).{core::Iterable::toSet}(){() → core::Set<core::num>}, set2);
}
static method useAddAllNullable() → void {
  dynamic dynamicSet1 = block {
    final core::Set<core::int> #t20 = new col::_CompactLinkedHashSet::•<core::int>();
    #t20.{core::Set::add}(0){(core::int) → core::bool};
    #t20.{core::Set::add}(1){(core::int) → core::bool};
    #t20.{core::Set::add}(2){(core::int) → core::bool};
  } =>#t20;
  dynamic dynamicSet2 = block {
    final core::Set<core::num> #t21 = new col::_CompactLinkedHashSet::•<core::num>();
    #t21.{core::Set::add}(3){(core::num) → core::bool};
    #t21.{core::Set::add}(4){(core::num) → core::bool};
    #t21.{core::Set::add}(5){(core::num) → core::bool};
  } =>#t21;
  dynamic dynamicSet3 = block {
    final core::Set<core::int?> #t22 = new col::_CompactLinkedHashSet::•<core::int?>();
    #t22.{core::Set::add}(6){(core::int?) → core::bool};
    #t22.{core::Set::add}(7){(core::int?) → core::bool};
    #t22.{core::Set::add}(8){(core::int?) → core::bool};
  } =>#t22;
  core::Iterable<core::int>? iterableIntSet = true ?{core::Set<core::int>?} block {
    final core::Set<core::int> #t23 = new col::_CompactLinkedHashSet::•<core::int>();
    #t23.{core::Set::add}(9){(core::int) → core::bool};
    #t23.{core::Set::add}(10){(core::int) → core::bool};
    #t23.{core::Set::add}(11){(core::int) → core::bool};
  } =>#t23 : null;
  core::Set<core::int>? intSet = true ?{core::Set<core::int>?} block {
    final core::Set<core::int> #t24 = new col::_CompactLinkedHashSet::•<core::int>();
    #t24.{core::Set::add}(12){(core::int) → core::bool};
    #t24.{core::Set::add}(13){(core::int) → core::bool};
    #t24.{core::Set::add}(14){(core::int) → core::bool};
  } =>#t24 : null;
  core::Set<core::int> set1 = block {
    final core::Set<core::int> #t25 = new col::_CompactLinkedHashSet::•<core::int>();
    final core::Iterable<dynamic>? #t26 = dynamicSet1 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>?;
    if(!(#t26 == null)) {
      core::Iterator<dynamic> :sync-for-iterator = #t26{core::Iterable<dynamic>}.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final dynamic #t27 = :sync-for-iterator.{core::Iterator::current};
        {
          final core::int #t28 = #t27 as{TypeError,ForNonNullableByDefault} core::int;
          #t25.{core::Set::add}(#t28){(core::int) → core::bool};
        }
      }
    }
    final core::Iterable<dynamic>? #t29 = dynamicSet2 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>?;
    if(!(#t29 == null)) {
      core::Iterator<dynamic> :sync-for-iterator = #t29{core::Iterable<dynamic>}.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final dynamic #t30 = :sync-for-iterator.{core::Iterator::current};
        {
          final core::int #t31 = #t30 as{TypeError,ForNonNullableByDefault} core::int;
          #t25.{core::Set::add}(#t31){(core::int) → core::bool};
        }
      }
    }
    final core::Iterable<dynamic>? #t32 = dynamicSet3 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>?;
    if(!(#t32 == null)) {
      core::Iterator<dynamic> :sync-for-iterator = #t32{core::Iterable<dynamic>}.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final dynamic #t33 = :sync-for-iterator.{core::Iterator::current};
        {
          final core::int #t34 = #t33 as{TypeError,ForNonNullableByDefault} core::int;
          #t25.{core::Set::add}(#t34){(core::int) → core::bool};
        }
      }
    }
    final core::Iterable<core::int>? #t35 = iterableIntSet;
    if(!(#t35 == null))
      #t25.{core::Set::addAll}(#t35{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
    final core::Iterable<core::int>? #t36 = intSet;
    if(!(#t36 == null))
      #t25.{core::Set::addAll}(#t36{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
  } =>#t25;
  self::expect(core::_GrowableList::generate<core::int>(15, (core::int i) → core::int => i).{core::Iterable::toSet}(){() → core::Set<core::int>}, set1);
  core::Set<core::num> set2 = block {
    final core::Set<core::num> #t37 = new col::_CompactLinkedHashSet::•<core::num>();
    final core::Iterable<dynamic>? #t38 = dynamicSet1 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>?;
    if(!(#t38 == null)) {
      core::Iterator<dynamic> :sync-for-iterator = #t38{core::Iterable<dynamic>}.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final dynamic #t39 = :sync-for-iterator.{core::Iterator::current};
        {
          final core::num #t40 = #t39 as{TypeError,ForNonNullableByDefault} core::num;
          #t37.{core::Set::add}(#t40){(core::num) → core::bool};
        }
      }
    }
    final core::Iterable<dynamic>? #t41 = dynamicSet2 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>?;
    if(!(#t41 == null)) {
      core::Iterator<dynamic> :sync-for-iterator = #t41{core::Iterable<dynamic>}.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final dynamic #t42 = :sync-for-iterator.{core::Iterator::current};
        {
          final core::num #t43 = #t42 as{TypeError,ForNonNullableByDefault} core::num;
          #t37.{core::Set::add}(#t43){(core::num) → core::bool};
        }
      }
    }
    final core::Iterable<dynamic>? #t44 = dynamicSet3 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>?;
    if(!(#t44 == null)) {
      core::Iterator<dynamic> :sync-for-iterator = #t44{core::Iterable<dynamic>}.{core::Iterable::iterator};
      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
        final dynamic #t45 = :sync-for-iterator.{core::Iterator::current};
        {
          final core::num #t46 = #t45 as{TypeError,ForNonNullableByDefault} core::num;
          #t37.{core::Set::add}(#t46){(core::num) → core::bool};
        }
      }
    }
    final core::Iterable<core::num>? #t47 = iterableIntSet;
    if(!(#t47 == null))
      #t37.{core::Set::addAll}(#t47{core::Iterable<core::num>}){(core::Iterable<core::num>) → void};
    final core::Iterable<core::num>? #t48 = intSet;
    if(!(#t48 == null))
      #t37.{core::Set::addAll}(#t48{core::Iterable<core::num>}){(core::Iterable<core::num>) → void};
  } =>#t37;
  self::expect(core::_GrowableList::generate<core::num>(15, (core::int i) → core::int => i).{core::Iterable::toSet}(){() → core::Set<core::num>}, set2);
}
static method main() → dynamic {
  self::useAddAll();
  self::useAddAllNullable();
}
static method expect(core::Set<dynamic> set1, core::Set<dynamic> set2) → void {
  if(!(set1.{_in::EfficientLengthIterable::length}{core::int} =={core::num::==}{(core::Object) → core::bool} set2.{_in::EfficientLengthIterable::length}{core::int})) {
    throw "Unexpected length. Expected ${set1.{_in::EfficientLengthIterable::length}{core::int}}, actual ${set2.{_in::EfficientLengthIterable::length}{core::int}}.";
  }
  {
    core::Iterator<dynamic> :sync-for-iterator = set1.{core::Iterable::iterator};
    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
      dynamic element = :sync-for-iterator.{core::Iterator::current};
      {
        if(!set2.{core::Set::contains}(element){(core::Object?) → core::bool}) {
          throw "Element ${element} not found. Expected ${set1}, actual ${set2}.";
        }
      }
    }
  }
}
