library;
import self as self;
import "dart:core" as core;
import "nsm_covariance_lib.dart" as nsm;

import "org-dartlang-testcase:///nsm_covariance_lib.dart";

abstract class D1 extends core::Object implements nsm::A<core::int>, nsm::B {
  synthetic constructor •() → self::D1
    : super core::Object::•()
    ;
  abstract forwarding-stub synthetic method _method1(core::int a, covariant-by-declaration core::int b, covariant-by-class core::int c, covariant-by-declaration covariant-by-class core::int d) → void;
  abstract forwarding-stub synthetic method _method2({core::int a = #C1, covariant-by-declaration core::int b = #C1, covariant-by-class core::int c = #C1, covariant-by-declaration covariant-by-class core::int d = #C1}) → void;
  abstract forwarding-stub synthetic method _method3(covariant-by-declaration core::int a, covariant-by-class core::int b) → void;
  abstract forwarding-stub synthetic method _method4({covariant-by-declaration core::int a = #C1, covariant-by-class core::int b = #C1}) → void;
}
abstract class D2 extends core::Object implements nsm::B, nsm::A<core::int> {
  synthetic constructor •() → self::D2
    : super core::Object::•()
    ;
  abstract forwarding-stub synthetic method _method1(core::int x, covariant-by-declaration core::int y, covariant-by-class core::int z, covariant-by-declaration covariant-by-class core::int w) → void;
  abstract forwarding-stub synthetic method _method2({core::int a = #C1, covariant-by-declaration core::int b = #C1, covariant-by-class core::int c = #C1, covariant-by-declaration covariant-by-class core::int d = #C1}) → void;
  abstract forwarding-stub synthetic method _method3(covariant-by-declaration core::int x, covariant-by-class core::int y) → void;
  abstract forwarding-stub synthetic method _method4({covariant-by-declaration core::int a = #C1, covariant-by-class core::int b = #C1}) → void;
}
class D3 extends core::Object implements nsm::A<core::int>, nsm::B {
  synthetic constructor •() → self::D3
    : super core::Object::•()
    ;
  @#C2
  method noSuchMethod(core::Invocation invocation) → dynamic
    return null;
  synthetic no-such-method-forwarder method _method1(core::int a, covariant-by-declaration core::int b, covariant-by-class core::int c, covariant-by-declaration covariant-by-class core::int d) → void
    return throw{for-error-handling} core::NoSuchMethodError::withInvocation(this, new core::_InvocationMirror::_withType(#C3, 0, #C4, core::List::unmodifiable<dynamic>(core::_GrowableList::_literal4<dynamic>(a, b, c, d)), core::Map::unmodifiable<core::Symbol, dynamic>(#C5)));
  synthetic no-such-method-forwarder method /* signature-type: ({a: core::int, b: core::int, c: core::int, d: core::int}) → void */ _method2({core::int? a = #C1, covariant-by-declaration core::int b = #C1, covariant-by-class core::int c = #C1, covariant-by-declaration covariant-by-class core::int d = #C1}) → void
    return throw{for-error-handling} core::NoSuchMethodError::withInvocation(this, new core::_InvocationMirror::_withType(#C6, 0, #C4, #C7, core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#C8: a, #C9: b, #C10: c, #C11: d})));
  synthetic no-such-method-forwarder method _method3(covariant-by-declaration core::int a, covariant-by-class core::int b) → void
    return throw{for-error-handling} core::NoSuchMethodError::withInvocation(this, new core::_InvocationMirror::_withType(#C12, 0, #C4, core::List::unmodifiable<dynamic>(core::_GrowableList::_literal2<dynamic>(a, b)), core::Map::unmodifiable<core::Symbol, dynamic>(#C5)));
  synthetic no-such-method-forwarder method _method4({covariant-by-declaration core::int a = #C1, covariant-by-class core::int b = #C1}) → void
    return throw{for-error-handling} core::NoSuchMethodError::withInvocation(this, new core::_InvocationMirror::_withType(#C13, 0, #C4, #C7, core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#C8: a, #C9: b})));
}
class D4 extends core::Object implements nsm::B, nsm::A<core::int> {
  synthetic constructor •() → self::D4
    : super core::Object::•()
    ;
  @#C2
  method noSuchMethod(core::Invocation invocation) → dynamic
    return null;
  synthetic no-such-method-forwarder method _method1(core::int x, covariant-by-declaration core::int y, covariant-by-class core::int z, covariant-by-declaration covariant-by-class core::int w) → void
    return throw{for-error-handling} core::NoSuchMethodError::withInvocation(this, new core::_InvocationMirror::_withType(#C3, 0, #C4, core::List::unmodifiable<dynamic>(core::_GrowableList::_literal4<dynamic>(x, y, z, w)), core::Map::unmodifiable<core::Symbol, dynamic>(#C5)));
  synthetic no-such-method-forwarder method /* signature-type: ({a: core::int, b: core::int, c: core::int, d: core::int}) → void */ _method2({core::int? a = #C1, covariant-by-declaration core::int b = #C1, covariant-by-class core::int c = #C1, covariant-by-declaration covariant-by-class core::int d = #C1}) → void
    return throw{for-error-handling} core::NoSuchMethodError::withInvocation(this, new core::_InvocationMirror::_withType(#C6, 0, #C4, #C7, core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#C8: a, #C9: b, #C10: c, #C11: d})));
  synthetic no-such-method-forwarder method _method3(covariant-by-declaration core::int x, covariant-by-class core::int y) → void
    return throw{for-error-handling} core::NoSuchMethodError::withInvocation(this, new core::_InvocationMirror::_withType(#C12, 0, #C4, core::List::unmodifiable<dynamic>(core::_GrowableList::_literal2<dynamic>(x, y)), core::Map::unmodifiable<core::Symbol, dynamic>(#C5)));
  synthetic no-such-method-forwarder method _method4({covariant-by-declaration core::int a = #C1, covariant-by-class core::int b = #C1}) → void
    return throw{for-error-handling} core::NoSuchMethodError::withInvocation(this, new core::_InvocationMirror::_withType(#C13, 0, #C4, #C7, core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#C8: a, #C9: b})));
}
static method main() → dynamic {}

library;
import self as nsm;
import "dart:core" as core;

abstract class A<T extends core::Object? = dynamic> extends core::Object {
  synthetic constructor •() → nsm::A<nsm::A::T%>
    : super core::Object::•()
    ;
  abstract method _method1(core::int a, core::int b, covariant-by-class nsm::A::T% c, covariant-by-class nsm::A::T% d) → void;
  abstract method _method2({core::int a = #C1, core::int b = #C1, covariant-by-class nsm::A::T% c = #C1, covariant-by-class nsm::A::T% d = #C1}) → void;
  abstract method _method3(core::int a, covariant-by-class nsm::A::T% b) → void;
  abstract method _method4({core::int a = #C1, covariant-by-class nsm::A::T% b = #C1}) → void;
}
abstract class B extends core::Object {
  synthetic constructor •() → nsm::B
    : super core::Object::•()
    ;
  abstract method _method1(core::int x, covariant-by-declaration core::int y, core::int z, covariant-by-declaration core::int w) → void;
  abstract method _method2({core::int a = #C1, covariant-by-declaration core::int b = #C1, core::int c = #C1, covariant-by-declaration core::int d = #C1}) → void;
  abstract method _method3(covariant-by-declaration core::int x, core::int y) → void;
  abstract method _method4({covariant-by-declaration core::int a = #C1, core::int b = #C1}) → void;
}
abstract class C1 extends core::Object implements nsm::A<core::int>, nsm::B {
  synthetic constructor •() → nsm::C1
    : super core::Object::•()
    ;
  abstract forwarding-stub synthetic method _method1(core::int a, covariant-by-declaration core::int b, covariant-by-class core::int c, covariant-by-declaration covariant-by-class core::int d) → void;
  abstract forwarding-stub synthetic method _method2({core::int a = #C1, covariant-by-declaration core::int b = #C1, covariant-by-class core::int c = #C1, covariant-by-declaration covariant-by-class core::int d = #C1}) → void;
  abstract forwarding-stub synthetic method _method3(covariant-by-declaration core::int a, covariant-by-class core::int b) → void;
  abstract forwarding-stub synthetic method _method4({covariant-by-declaration core::int a = #C1, covariant-by-class core::int b = #C1}) → void;
}
abstract class C2 extends core::Object implements nsm::B, nsm::A<core::int> {
  synthetic constructor •() → nsm::C2
    : super core::Object::•()
    ;
  abstract forwarding-stub synthetic method _method1(core::int x, covariant-by-declaration core::int y, covariant-by-class core::int z, covariant-by-declaration covariant-by-class core::int w) → void;
  abstract forwarding-stub synthetic method _method2({core::int a = #C1, covariant-by-declaration core::int b = #C1, covariant-by-class core::int c = #C1, covariant-by-declaration covariant-by-class core::int d = #C1}) → void;
  abstract forwarding-stub synthetic method _method3(covariant-by-declaration core::int x, covariant-by-class core::int y) → void;
  abstract forwarding-stub synthetic method _method4({covariant-by-declaration core::int a = #C1, covariant-by-class core::int b = #C1}) → void;
}
class C3 extends core::Object implements nsm::A<core::int>, nsm::B {
  synthetic constructor •() → nsm::C3
    : super core::Object::•()
    ;
  @#C2
  method noSuchMethod(core::Invocation invocation) → dynamic
    return null;
  synthetic no-such-method-forwarder method _method1(core::int a, covariant-by-declaration core::int b, covariant-by-class core::int c, covariant-by-declaration covariant-by-class core::int d) → void
    return this.{nsm::C3::noSuchMethod}(new core::_InvocationMirror::_withType(#C14, 0, #C4, core::List::unmodifiable<dynamic>(core::_GrowableList::_literal4<dynamic>(a, b, c, d)), core::Map::unmodifiable<core::Symbol, dynamic>(#C5))){(core::Invocation) → dynamic};
  synthetic no-such-method-forwarder method /* signature-type: ({a: core::int, b: core::int, c: core::int, d: core::int}) → void */ _method2({core::int? a = #C1, covariant-by-declaration core::int b = #C1, covariant-by-class core::int c = #C1, covariant-by-declaration covariant-by-class core::int d = #C1}) → void
    return this.{nsm::C3::noSuchMethod}(new core::_InvocationMirror::_withType(#C15, 0, #C4, #C7, core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#C8: a, #C9: b, #C10: c, #C11: d}))){(core::Invocation) → dynamic};
  synthetic no-such-method-forwarder method _method3(covariant-by-declaration core::int a, covariant-by-class core::int b) → void
    return this.{nsm::C3::noSuchMethod}(new core::_InvocationMirror::_withType(#C16, 0, #C4, core::List::unmodifiable<dynamic>(core::_GrowableList::_literal2<dynamic>(a, b)), core::Map::unmodifiable<core::Symbol, dynamic>(#C5))){(core::Invocation) → dynamic};
  synthetic no-such-method-forwarder method _method4({covariant-by-declaration core::int a = #C1, covariant-by-class core::int b = #C1}) → void
    return this.{nsm::C3::noSuchMethod}(new core::_InvocationMirror::_withType(#C17, 0, #C4, #C7, core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#C8: a, #C9: b}))){(core::Invocation) → dynamic};
}
class C4 extends core::Object implements nsm::B, nsm::A<core::int> {
  synthetic constructor •() → nsm::C4
    : super core::Object::•()
    ;
  @#C2
  method noSuchMethod(core::Invocation invocation) → dynamic
    return null;
  synthetic no-such-method-forwarder method _method1(core::int x, covariant-by-declaration core::int y, covariant-by-class core::int z, covariant-by-declaration covariant-by-class core::int w) → void
    return this.{nsm::C4::noSuchMethod}(new core::_InvocationMirror::_withType(#C14, 0, #C4, core::List::unmodifiable<dynamic>(core::_GrowableList::_literal4<dynamic>(x, y, z, w)), core::Map::unmodifiable<core::Symbol, dynamic>(#C5))){(core::Invocation) → dynamic};
  synthetic no-such-method-forwarder method /* signature-type: ({a: core::int, b: core::int, c: core::int, d: core::int}) → void */ _method2({core::int? a = #C1, covariant-by-declaration core::int b = #C1, covariant-by-class core::int c = #C1, covariant-by-declaration covariant-by-class core::int d = #C1}) → void
    return this.{nsm::C4::noSuchMethod}(new core::_InvocationMirror::_withType(#C15, 0, #C4, #C7, core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#C8: a, #C9: b, #C10: c, #C11: d}))){(core::Invocation) → dynamic};
  synthetic no-such-method-forwarder method _method3(covariant-by-declaration core::int x, covariant-by-class core::int y) → void
    return this.{nsm::C4::noSuchMethod}(new core::_InvocationMirror::_withType(#C16, 0, #C4, core::List::unmodifiable<dynamic>(core::_GrowableList::_literal2<dynamic>(x, y)), core::Map::unmodifiable<core::Symbol, dynamic>(#C5))){(core::Invocation) → dynamic};
  synthetic no-such-method-forwarder method _method4({covariant-by-declaration core::int a = #C1, covariant-by-class core::int b = #C1}) → void
    return this.{nsm::C4::noSuchMethod}(new core::_InvocationMirror::_withType(#C17, 0, #C4, #C7, core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#C8: a, #C9: b}))){(core::Invocation) → dynamic};
}

constants  {
  #C1 = null
  #C2 = core::_Override {}
  #C3 = #org-dartlang-testcase:///nsm_covariance.dart::_method1
  #C4 = <core::Type>[]
  #C5 = <core::Symbol, dynamic>{}
  #C6 = #org-dartlang-testcase:///nsm_covariance.dart::_method2
  #C7 = <dynamic>[]
  #C8 = #a
  #C9 = #b
  #C10 = #c
  #C11 = #d
  #C12 = #org-dartlang-testcase:///nsm_covariance.dart::_method3
  #C13 = #org-dartlang-testcase:///nsm_covariance.dart::_method4
  #C14 = #org-dartlang-testcase:///nsm_covariance_lib.dart::_method1
  #C15 = #org-dartlang-testcase:///nsm_covariance_lib.dart::_method2
  #C16 = #org-dartlang-testcase:///nsm_covariance_lib.dart::_method3
  #C17 = #org-dartlang-testcase:///nsm_covariance_lib.dart::_method4
}
