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

import "dart:async";

class C<T extends core::Object? = dynamic> extends core::Object {
  field FutureOr<dynamic>? _#C#field1 = null;
  field core::bool _#C#field1#isSet = false;
  field FutureOr<dynamic>? _#C#field2 = null;
  field core::bool _#C#field2#isSet = false;
  generic-covariant-impl field FutureOr<self::C::T%>? _#C#field3 = null;
  field core::bool _#C#field3#isSet = false;
  generic-covariant-impl field FutureOr<self::C::T?>? _#C#field4 = null;
  field core::bool _#C#field4#isSet = false;
  generic-covariant-impl field FutureOr<self::C::T?>? _#C#field5 = null;
  field core::bool _#C#field5#isSet = false;
  synthetic constructor •() → self::C<self::C::T%>
    : super core::Object::•()
    ;
  get field1() → FutureOr<dynamic>
    return this.{self::C::_#C#field1#isSet}{core::bool} ?{FutureOr<dynamic>} this.{self::C::_#C#field1}{FutureOr<dynamic>?} : throw new _in::LateError::fieldNI("field1");
  set field1(FutureOr<dynamic>#t1) → void {
    this.{self::C::_#C#field1#isSet} = true;
    this.{self::C::_#C#field1} = #t1;
  }
  get field2() → FutureOr<dynamic>?
    return this.{self::C::_#C#field2#isSet}{core::bool} ?{FutureOr<dynamic>?} this.{self::C::_#C#field2}{FutureOr<dynamic>?} : throw new _in::LateError::fieldNI("field2");
  set field2(FutureOr<dynamic>? #t2) → void {
    this.{self::C::_#C#field2#isSet} = true;
    this.{self::C::_#C#field2} = #t2;
  }
  get field3() → FutureOr<self::C::T%>
    return this.{self::C::_#C#field3#isSet}{core::bool} ?{FutureOr<self::C::T%>} let final FutureOr<self::C::T%>? #t3 = this.{self::C::_#C#field3}{FutureOr<self::C::T%>?} in #t3{FutureOr<self::C::T%>} : throw new _in::LateError::fieldNI("field3");
  set field3(generic-covariant-impl FutureOr<self::C::T%>#t4) → void {
    this.{self::C::_#C#field3#isSet} = true;
    this.{self::C::_#C#field3} = #t4;
  }
  get field4() → FutureOr<self::C::T?>
    return this.{self::C::_#C#field4#isSet}{core::bool} ?{FutureOr<self::C::T?>} this.{self::C::_#C#field4}{FutureOr<self::C::T?>?} : throw new _in::LateError::fieldNI("field4");
  set field4(generic-covariant-impl FutureOr<self::C::T?>#t5) → void {
    this.{self::C::_#C#field4#isSet} = true;
    this.{self::C::_#C#field4} = #t5;
  }
  get field5() → FutureOr<self::C::T?>?
    return this.{self::C::_#C#field5#isSet}{core::bool} ?{FutureOr<self::C::T?>?} this.{self::C::_#C#field5}{FutureOr<self::C::T?>?} : throw new _in::LateError::fieldNI("field5");
  set field5(generic-covariant-impl FutureOr<self::C::T?>? #t6) → void {
    this.{self::C::_#C#field5#isSet} = true;
    this.{self::C::_#C#field5} = #t6;
  }
  method method() → dynamic {
    lowered FutureOr<dynamic>? #local1;
    lowered core::bool #local1#isSet = false;
    function #local1#get() → FutureOr<dynamic>
      return #local1#isSet ?{FutureOr<dynamic>} #local1 : throw new _in::LateError::localNI("local1");
    function #local1#set(FutureOr<dynamic>#t7) → dynamic {
      #local1#isSet = true;
      return #local1 = #t7;
    }
    lowered FutureOr<dynamic>? #local2;
    lowered core::bool #local2#isSet = false;
    function #local2#get() → FutureOr<dynamic>?
      return #local2#isSet ?{FutureOr<dynamic>?} #local2 : throw new _in::LateError::localNI("local2");
    function #local2#set(FutureOr<dynamic>? #t8) → dynamic {
      #local2#isSet = true;
      return #local2 = #t8;
    }
    lowered FutureOr<self::C::T%>? #local3;
    lowered core::bool #local3#isSet = false;
    function #local3#get() → FutureOr<self::C::T%>
      return #local3#isSet ?{FutureOr<self::C::T%>} #local3{FutureOr<self::C::T%>} : throw new _in::LateError::localNI("local3");
    function #local3#set(FutureOr<self::C::T%>#t9) → dynamic {
      #local3#isSet = true;
      return #local3 = #t9;
    }
    lowered FutureOr<self::C::T?>? #local4;
    lowered core::bool #local4#isSet = false;
    function #local4#get() → FutureOr<self::C::T?>
      return #local4#isSet ?{FutureOr<self::C::T?>} #local4 : throw new _in::LateError::localNI("local4");
    function #local4#set(FutureOr<self::C::T?>#t10) → dynamic {
      #local4#isSet = true;
      return #local4 = #t10;
    }
    lowered FutureOr<self::C::T?>? #local5;
    lowered core::bool #local5#isSet = false;
    function #local5#get() → FutureOr<self::C::T?>?
      return #local5#isSet ?{FutureOr<self::C::T?>?} #local5 : throw new _in::LateError::localNI("local5");
    function #local5#set(FutureOr<self::C::T?>? #t11) → dynamic {
      #local5#isSet = true;
      return #local5 = #t11;
    }
  }
}
static field FutureOr<dynamic>? _#field1 = null;
static field core::bool _#field1#isSet = false;
static field FutureOr<dynamic>? _#field2 = null;
static field core::bool _#field2#isSet = false;
static field FutureOr<dynamic>? _#field3 = null;
static field core::bool _#field3#isSet = false;
static field FutureOr<core::int>? _#field4 = null;
static field core::bool _#field4#isSet = false;
static field FutureOr<core::int?>? _#field5 = null;
static field core::bool _#field5#isSet = false;
static field FutureOr<core::int?>? _#field6 = null;
static field core::bool _#field6#isSet = false;
static method method1() → FutureOr<dynamic>
  return null;
static method method2() → FutureOr<dynamic>?
  return null;
static method method3() → FutureOr<dynamic>
  return null;
static method method4() → FutureOr<core::int>
  return 0;
static method method5() → FutureOr<core::int?>
  return null;
static method method6() → FutureOr<core::int?>?
  return null;
static get field1() → FutureOr<dynamic> {
  if(!self::_#field1#isSet) {
    self::_#field1 = self::method1();
    self::_#field1#isSet = true;
  }
  return self::_#field1;
}
static set field1(FutureOr<dynamic>#t12) → void {
  self::_#field1#isSet = true;
  self::_#field1 = #t12;
}
static get field2() → FutureOr<dynamic>? {
  if(!self::_#field2#isSet) {
    self::_#field2 = self::method2();
    self::_#field2#isSet = true;
  }
  return self::_#field2;
}
static set field2(FutureOr<dynamic>? #t13) → void {
  self::_#field2#isSet = true;
  self::_#field2 = #t13;
}
static get field3() → FutureOr<dynamic> {
  if(!self::_#field3#isSet) {
    self::_#field3 = self::method3();
    self::_#field3#isSet = true;
  }
  return self::_#field3;
}
static set field3(FutureOr<dynamic>#t14) → void {
  self::_#field3#isSet = true;
  self::_#field3 = #t14;
}
static get field4() → FutureOr<core::int>
  return let final FutureOr<core::int>? #t15 = self::_#field4 in #t15 == null ?{FutureOr<core::int>} self::_#field4 = self::method4() : #t15{FutureOr<core::int>};
static set field4(FutureOr<core::int>#t16) → void
  self::_#field4 = #t16;
static get field5() → FutureOr<core::int?> {
  if(!self::_#field5#isSet) {
    self::_#field5 = self::method5();
    self::_#field5#isSet = true;
  }
  return self::_#field5;
}
static set field5(FutureOr<core::int?>#t17) → void {
  self::_#field5#isSet = true;
  self::_#field5 = #t17;
}
static get field6() → FutureOr<core::int?>? {
  if(!self::_#field6#isSet) {
    self::_#field6 = self::method6();
    self::_#field6#isSet = true;
  }
  return self::_#field6;
}
static set field6(FutureOr<core::int?>? #t18) → void {
  self::_#field6#isSet = true;
  self::_#field6 = #t18;
}
static method main() → dynamic {}
