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

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

class Class extends core::Object {
  synthetic constructor •() → self::Class
    : super core::Object::•()
    ;
  method /* from org-dartlang-testcase:///augment_concrete_lib2.dart */ instanceMethod() → void {
    this.{self::Class::_#instanceMethod#augment1}(){() → void};
    core::print("instanceMethod augmentation 2");
    this.{self::Class::_#instanceMethod#augment1}(){() → void};
  }
  static method /* from org-dartlang-testcase:///augment_concrete_lib2.dart */ staticMethod() → void {
    self::Class::_#staticMethod#augment1();
    core::print("staticMethod augmentation 2");
    self::Class::_#staticMethod#augment1();
  }
  method /* from org-dartlang-testcase:///augment_concrete_lib2.dart */ externalInstanceMethod() → void {
    core::print("externalInstanceMethod augmentation 2");
  }
  method _#instanceMethod#augment0() → void {
    core::print("instanceMethod original");
  }
  method /* from org-dartlang-testcase:///augment_concrete_lib1.dart */ _#instanceMethod#augment1() → void {
    this.{self::Class::_#instanceMethod#augment0}(){() → void};
    core::print("instanceMethod augmentation 1");
    this.{self::Class::_#instanceMethod#augment0}(){() → void};
  }
  static method _#staticMethod#augment0() → void {
    core::print("staticMethod original");
  }
  static method /* from org-dartlang-testcase:///augment_concrete_lib1.dart */ _#staticMethod#augment1() → void {
    self::Class::_#staticMethod#augment0();
    core::print("staticMethod augmentation 1");
    self::Class::_#staticMethod#augment0();
  }
}
static method /* from org-dartlang-testcase:///augment_concrete_lib2.dart */ topLevelMethod() → void {
  self::_#topLevelMethod#augment1();
  core::print("topLevelMethod augmentation 2");
  self::_#topLevelMethod#augment1();
}
static method /* from org-dartlang-testcase:///augment_concrete_lib1.dart */ externalTopLevelMethod() → void {
  core::print("externalTopLevelMethod augmentation 1");
}
static method main() → dynamic {
  self::topLevelMethod();
  new self::Class::•().{self::Class::instanceMethod}(){() → void};
  self::Class::staticMethod();
  self::externalTopLevelMethod();
  new self::Class::•().{self::Class::externalInstanceMethod}(){() → void};
}
static method _#topLevelMethod#augment0() → void {
  core::print("topLevelMethod original");
}
static method /* from org-dartlang-testcase:///augment_concrete_lib1.dart */ _#topLevelMethod#augment1() → void {
  self::_#topLevelMethod#augment0();
  core::print("topLevelMethod augmentation 1");
  self::_#topLevelMethod#augment0();
}
