abstract class A {
  A(this.property4, this.property5, this.property6);
  covariant int property6;
  int? get property3;
  int? property5;
  int get property1;
  int get property2;
  int property4;
  static int? get property9 => 0;
  static int get property7 => 0;
  static int get property8 => 0;
  static void set property7(int value) {}
  static void set property8(int? value) {}
  static void set property9(int value) {}
  void set property1(int i);
  void set property2(int? i);
  void set property3(int i);
}

abstract class B1 {
  B1(this.property4, this.property5, this.property6);
  final int? property6;
  final int property4;
  final int property5;
  int? get property3;
  int get property1;
  int get property2;
}

abstract class B2 implements B1 {
  void set property1(int i);
  void set property2(int? i);
  void set property3(int i);
  void set property4(int i);
  void set property5(int? i);
  void set property6(int i);
}

abstract class C1 {
  C1(this.property4, this.property5, this.property6);
  int? property5;
  int property4;
  int property6;
  void set property1(int i);
  void set property2(int? i);
  void set property3(int i);
}

abstract class C2 implements C1 {
  int? get property3;
  int? get property6;
  int get property1;
  int get property2;
  int get property4;
  int get property5;
}

abstract class D1 {
  int? get property3;
  int get property1;
  int get property2;
}

abstract class D2 {
  void set property1(int i);
  void set property2(int? i);
  void set property3(int i);
}

abstract class D3 implements D1, D2 {}

abstract class D4 implements D3 {}

int? get property3 => 0;
int get property1 => 0;
int get property2 => 0;
main() {}
void set property1(int value) {}
void set property2(int? value) {}
void set property3(int value) {}
