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

static method method1(core::List<dynamic> o) → dynamic {
  #L1:
  {
    final synthesized core::List<dynamic> #0#0 = o;
    {
      if(#0#0.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1) {
        {
          core::print(o);
        }
      }
    }
  }
  #L2:
  {
    final synthesized core::List<dynamic> #1#0 = o;
    {
      if(#1#0.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C2) {
        {
          core::print(o);
        }
      }
    }
  }
  #L3:
  {
    final synthesized core::List<dynamic> #2#0 = o;
    {
      if(#2#0.{core::List::length}{core::int}.{core::num::>=}(#C1){(core::num) → core::bool}) {
        {
          core::print(o);
        }
      }
    }
  }
  #L4:
  {
    final synthesized core::List<dynamic> #3#0 = o;
    {
      if(#3#0.{core::List::length}{core::int}.{core::num::>=}(#C1){(core::num) → core::bool}) {
        {
          core::print(o);
        }
      }
    }
  }
  #L5:
  {
    final synthesized core::List<dynamic> #4#0 = o;
    {
      if(#4#0.{core::List::length}{core::int}.{core::num::>=}(#C2){(core::num) → core::bool}) {
        {
          core::print(o);
        }
      }
    }
  }
}
static method method2(dynamic o) → dynamic {
  #L6:
  {
    final synthesized dynamic #0#0 = o;
    {
      if(#0#0 is{ForNonNullableByDefault} core::List<dynamic> && #0#0{core::List<dynamic>}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1) {
        {
          core::print(o{core::List<dynamic>});
        }
      }
    }
  }
  #L7:
  {
    final synthesized dynamic #1#0 = o;
    {
      if(#1#0 is{ForNonNullableByDefault} core::List<dynamic> && #1#0{core::List<dynamic>}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C2) {
        {
          core::print(o{core::List<dynamic>});
        }
      }
    }
  }
  #L8:
  {
    final synthesized dynamic #2#0 = o;
    {
      if(#2#0 is{ForNonNullableByDefault} core::List<dynamic> && #2#0{core::List<dynamic>}.{core::List::length}{core::int}.{core::num::>=}(#C1){(core::num) → core::bool}) {
        {
          core::print(o{core::List<dynamic>});
        }
      }
    }
  }
  #L9:
  {
    final synthesized dynamic #3#0 = o;
    {
      if(#3#0 is{ForNonNullableByDefault} core::List<dynamic> && #3#0{core::List<dynamic>}.{core::List::length}{core::int}.{core::num::>=}(#C1){(core::num) → core::bool}) {
        {
          core::print(o{core::List<dynamic>});
        }
      }
    }
  }
  #L10:
  {
    final synthesized dynamic #4#0 = o;
    {
      if(#4#0 is{ForNonNullableByDefault} core::List<dynamic> && #4#0{core::List<dynamic>}.{core::List::length}{core::int}.{core::num::>=}(#C2){(core::num) → core::bool}) {
        {
          core::print(o{core::List<dynamic>});
        }
      }
    }
  }
}
static method method3(core::List<dynamic> o) → dynamic {
  #L11:
  {
    final synthesized core::List<dynamic> #0#0 = o;
    {
      if(#0#0.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C2 && #C1 =={core::num::==}{(core::Object) → core::bool} #0#0.{core::List::[]}(1){(core::int) → dynamic}) {
        {
          core::print(o);
        }
      }
    }
  }
  #L12:
  {
    final synthesized core::List<dynamic> #1#0 = o;
    {
      if(#1#0.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C2 && #C1 =={core::num::==}{(core::Object) → core::bool} #1#0.{core::List::[]}(0){(core::int) → dynamic}) {
        {
          core::print(o);
        }
      }
    }
  }
  #L13:
  {
    final synthesized core::List<dynamic> #2#0 = o;
    {
      hoisted core::List<dynamic> a;
      if(#2#0.{core::List::length}{core::int}.{core::num::>=}(#C1){(core::num) → core::bool} && (let final dynamic #t1 = a = #2#0.{core::List::sublist}(1){(core::int, [core::int?]) → core::List<dynamic>} in true)) {
        {
          core::print(o);
        }
      }
    }
  }
  #L14:
  {
    final synthesized core::List<dynamic> #3#0 = o;
    late final synthesized core::int #3#1 = #3#0.{core::List::length}{core::int};
    {
      hoisted core::List<dynamic> a;
      if(#3#1.{core::num::>=}(#C1){(core::num) → core::bool} && (let final dynamic #t2 = a = #3#0.{core::List::sublist}(0, #3#1.{core::num::-}(1){(core::num) → core::int}){(core::int, [core::int?]) → core::List<dynamic>} in true)) {
        {
          core::print(o);
        }
      }
    }
  }
  #L15:
  {
    final synthesized core::List<dynamic> #4#0 = o;
    {
      if(#4#0.{core::List::length}{core::int}.{core::num::>=}(#C2){(core::num) → core::bool} && #C1 =={core::num::==}{(core::Object) → core::bool} #4#0.{core::List::[]}(0){(core::int) → dynamic}) {
        {
          core::print(o);
        }
      }
    }
  }
  #L16:
  {
    final synthesized core::List<dynamic> #5#0 = o;
    late final synthesized core::int #5#1 = #5#0.{core::List::length}{core::int};
    {
      if(#5#1.{core::num::>=}(#C2){(core::num) → core::bool} && #C1 =={core::num::==}{(core::Object) → core::bool} #5#0.{core::List::[]}(#5#1.{core::num::-}(1){(core::num) → core::int}){(core::int) → dynamic}) {
        {
          core::print(o);
        }
      }
    }
  }
}
static method method4(dynamic o) → dynamic {
  #L17:
  {
    final synthesized dynamic #0#0 = o;
    {
      if(#0#0 is{ForNonNullableByDefault} core::List<dynamic> && #0#0{core::List<dynamic>}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C2 && #C1 =={core::num::==}{(core::Object) → core::bool} #0#0{core::List<dynamic>}.{core::List::[]}(1){(core::int) → dynamic}) {
        {
          core::print(o{core::List<dynamic>});
        }
      }
    }
  }
  #L18:
  {
    final synthesized dynamic #1#0 = o;
    {
      if(#1#0 is{ForNonNullableByDefault} core::List<dynamic> && #1#0{core::List<dynamic>}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C2 && #C1 =={core::num::==}{(core::Object) → core::bool} #1#0{core::List<dynamic>}.{core::List::[]}(0){(core::int) → dynamic}) {
        {
          core::print(o{core::List<dynamic>});
        }
      }
    }
  }
  #L19:
  {
    final synthesized dynamic #2#0 = o;
    {
      hoisted core::List<dynamic> a;
      if(#2#0 is{ForNonNullableByDefault} core::List<dynamic> && #2#0{core::List<dynamic>}.{core::List::length}{core::int}.{core::num::>=}(#C1){(core::num) → core::bool} && (let final dynamic #t3 = a = #2#0{core::List<dynamic>}.{core::List::sublist}(1){(core::int, [core::int?]) → core::List<dynamic>} in true)) {
        {
          core::print(o{core::List<dynamic>});
        }
      }
    }
  }
  #L20:
  {
    final synthesized dynamic #3#0 = o;
    late final synthesized core::int #3#2 = #3#0{core::List<dynamic>}.{core::List::length}{core::int};
    {
      hoisted core::List<dynamic> a;
      if(#3#0 is{ForNonNullableByDefault} core::List<dynamic> && #3#2.{core::num::>=}(#C1){(core::num) → core::bool} && (let final dynamic #t4 = a = #3#0{core::List<dynamic>}.{core::List::sublist}(0, #3#2.{core::num::-}(1){(core::num) → core::int}){(core::int, [core::int?]) → core::List<dynamic>} in true)) {
        {
          core::print(o{core::List<dynamic>});
        }
      }
    }
  }
  #L21:
  {
    final synthesized dynamic #4#0 = o;
    {
      if(#4#0 is{ForNonNullableByDefault} core::List<dynamic> && #4#0{core::List<dynamic>}.{core::List::length}{core::int}.{core::num::>=}(#C2){(core::num) → core::bool} && #C1 =={core::num::==}{(core::Object) → core::bool} #4#0{core::List<dynamic>}.{core::List::[]}(0){(core::int) → dynamic}) {
        {
          core::print(o{core::List<dynamic>});
        }
      }
    }
  }
  #L22:
  {
    final synthesized dynamic #5#0 = o;
    late final synthesized core::int #5#2 = #5#0{core::List<dynamic>}.{core::List::length}{core::int};
    {
      if(#5#0 is{ForNonNullableByDefault} core::List<dynamic> && #5#2.{core::num::>=}(#C2){(core::num) → core::bool} && #C1 =={core::num::==}{(core::Object) → core::bool} #5#0{core::List<dynamic>}.{core::List::[]}(#5#2.{core::num::-}(1){(core::num) → core::int}){(core::int) → dynamic}) {
        {
          core::print(o{core::List<dynamic>});
        }
      }
    }
  }
}
static method method5(dynamic o) → dynamic {
  #L23:
  {
    final synthesized dynamic #0#0 = o;
    {
      if(#0#0 is{ForNonNullableByDefault} core::List<dynamic> && #0#0{core::List<dynamic>}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && #0#0{core::List<dynamic>}.{core::List::[]}(0){(core::int) → dynamic} is{ForNonNullableByDefault} core::int) {
        {
          core::print(o{core::List<dynamic>});
        }
      }
    }
  }
  #L24:
  {
    final synthesized dynamic #1#0 = o;
    {
      if(#1#0 is{ForNonNullableByDefault} core::List<dynamic> && #1#0{core::List<dynamic>}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C2 && #1#0{core::List<dynamic>}.{core::List::[]}(0){(core::int) → dynamic} is{ForNonNullableByDefault} core::int && #1#0{core::List<dynamic>}.{core::List::[]}(1){(core::int) → dynamic} is{ForNonNullableByDefault} core::String) {
        {
          core::print(o{core::List<dynamic>});
        }
      }
    }
  }
  #L25:
  {
    final synthesized dynamic #2#0 = o;
    {
      if(#2#0 is{ForNonNullableByDefault} core::List<dynamic> && #2#0{core::List<dynamic>}.{core::List::length}{core::int}.{core::num::>=}(#C1){(core::num) → core::bool} && #2#0{core::List<dynamic>}.{core::List::[]}(0){(core::int) → dynamic} is{ForNonNullableByDefault} core::int) {
        {
          core::print(o{core::List<dynamic>});
        }
      }
    }
  }
  #L26:
  {
    final synthesized dynamic #3#0 = o;
    late final synthesized core::int #3#2 = #3#0{core::List<dynamic>}.{core::List::length}{core::int};
    {
      if(#3#0 is{ForNonNullableByDefault} core::List<dynamic> && #3#2.{core::num::>=}(#C1){(core::num) → core::bool} && #3#0{core::List<dynamic>}.{core::List::[]}(#3#2.{core::num::-}(1){(core::num) → core::int}){(core::int) → dynamic} is{ForNonNullableByDefault} core::String) {
        {
          core::print(o{core::List<dynamic>});
        }
      }
    }
  }
  #L27:
  {
    final synthesized dynamic #4#0 = o;
    late final synthesized core::int #4#2 = #4#0{core::List<dynamic>}.{core::List::length}{core::int};
    {
      if(#4#0 is{ForNonNullableByDefault} core::List<dynamic> && #4#2.{core::num::>=}(#C2){(core::num) → core::bool} && #4#0{core::List<dynamic>}.{core::List::[]}(0){(core::int) → dynamic} is{ForNonNullableByDefault} core::String && #4#0{core::List<dynamic>}.{core::List::[]}(#4#2.{core::num::-}(1){(core::num) → core::int}){(core::int) → dynamic} is{ForNonNullableByDefault} core::int) {
        {
          core::print(o{core::List<dynamic>});
        }
      }
    }
  }
}

constants  {
  #C1 = 1
  #C2 = 2
}
