main = mai::main;
//
// Problems in component:
//
// org-dartlang-test:///b.dart:14:7: Error: 'C' can't implement both 'I<int>' and 'I<String>'
//  - 'I' is from 'org-dartlang-test:///b.dart'.
// class C extends A implements B {}
//       ^
//
library bLibrary from "org-dartlang-test:///b.dart" as bLi {

  class I<T extends dart.core::Object? = dynamic> extends dart.core::Object {
    synthetic constructor •() → bLi::I<bLi::I::T%>
      : super dart.core::Object::•()
      ;
  }
  class A extends dart.core::Object implements bLi::I<dart.core::int> {
    synthetic constructor •() → bLi::A
      : super dart.core::Object::•()
      ;
  }
  class B extends dart.core::Object implements bLi::I<dart.core::String> {
    synthetic constructor •() → bLi::B
      : super dart.core::Object::•()
      ;
  }
  class C extends bLi::A implements bLi::B {
    synthetic constructor •() → bLi::C
      : super bLi::A::•()
      ;
  }
  static method foo() → dynamic {
    dart.core::print("hello from b.dart foo!");
    dart.core::print(new bLi::C::•());
  }
}
library mainLibrary from "org-dartlang-test:///main.dart" as mai {

  import "org-dartlang-test:///b.dart" as b;

  static method main() → dynamic {
    bLi::foo();
  }
}
