library;
//
// Problems in library:
//
// pkg/front_end/testcases/general/error_recovery/issue_26810.dart:6:37: Error: Binary operator 'xor' is written as '^' instead of the written out word.
// Try replacing 'xor' with '^'.
//   int get a => runtimeType.hashCode xor null.hashCode;
//                                     ^^^
//
// pkg/front_end/testcases/general/error_recovery/issue_26810.dart:11:41: Error: Binary operator 'xor' is written as '^' instead of the written out word.
// Try replacing 'xor' with '^'.
//   int get e => 1 + runtimeType.hashCode xor null.hashCode + 3;
//                                         ^^^
//
// pkg/front_end/testcases/general/error_recovery/issue_26810.dart:16:28: Error: Binary operator 'xor' is written as '^' instead of the written out word.
// Try replacing 'xor' with '^'.
//   int i(int x, int y) => x xor y;
//                            ^^^
//
// pkg/front_end/testcases/general/error_recovery/issue_26810.dart:23:32: Error: Binary operator 'xor' is written as '^' instead of the written out word.
// Try replacing 'xor' with '^'.
//   int o(int x, int y) => 1 + x xor y + 3;
//                                ^^^
//
// pkg/front_end/testcases/general/error_recovery/issue_26810.dart:36:31: Error: Binary operator 'xor' is written as '^' instead of the written out word.
// Try replacing 'xor' with '^'.
//   Key(int x, int y) : foo = x xor y, bar = x xor y {
//                               ^^^
//
// pkg/front_end/testcases/general/error_recovery/issue_26810.dart:36:46: Error: Binary operator 'xor' is written as '^' instead of the written out word.
// Try replacing 'xor' with '^'.
//   Key(int x, int y) : foo = x xor y, bar = x xor y {
//                                              ^^^
//
import self as self;
import "dart:core" as core;

abstract class Key extends core::Object {
  field core::int* foo;
  field core::int* bar;
  constructor •(core::int* x, core::int* y) → self::Key*
    ;
  constructor NotDuplicate(core::int* x, core::int* y) → self::Key*
    ;
  get a() → core::int*
    ;
  get b() → core::int*
    ;
  get c() → core::int*
    ;
  get d() → core::int*
    ;
  get e() → core::int*
    ;
  get f() → core::int*
    ;
  get g() → core::int*
    ;
  get h() → core::int*
    ;
  method i(core::int* x, core::int* y) → core::int*
    ;
  method j(core::int* x, core::int* y) → core::int*
    ;
  method k(core::int* x, core::int* y) → core::int*
    ;
  method l(core::int* x, core::int* y) → core::int*
    ;
  method m(core::int* x, core::int* y) → core::int*
    ;
  method n(core::int* x, core::int* y) → core::int*
    ;
  method o(core::int* x, core::int* y) → core::int*
    ;
  method p(core::int* x, core::int* y) → core::int*
    ;
  method q(core::int* x, core::int* y) → core::int*
    ;
  method r(core::int* x, core::int* y) → core::int*
    ;
  method s(core::int* x, core::int* y) → dynamic
    ;
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _identityHashCode() → core::int*; -> core::Object::_identityHashCode
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
  abstract member-signature operator /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ ==(dynamic other) → core::bool*; -> core::Object::==
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ hashCode() → core::int*; -> core::Object::hashCode
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ toString() → core::String*; -> core::Object::toString
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ runtimeType() → core::Type*; -> core::Object::runtimeType
}
static method main() → dynamic
  ;
