library;
//
// Problems in library:
//
// pkg/front_end/testcases/dartdevc/conditional_import.dart:20:11: Error: The getter 'certificate' isn't defined for the type 'HttpRequest'.
//  - 'HttpRequest' is from 'dart:html'.
// Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
//   request.certificate; // error (from dart:io)
//           ^^^^^^^^^^^
//
// pkg/front_end/testcases/dartdevc/conditional_import.dart:27:11: Error: The getter 'certificate' isn't defined for the type 'HttpRequest'.
//  - 'HttpRequest' is from 'dart:html'.
// Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
//   request.certificate; // error (from dart:io)
//           ^^^^^^^^^^^
//
// pkg/front_end/testcases/dartdevc/conditional_import.dart:34:11: Error: The getter 'certificate' isn't defined for the type 'HttpRequest'.
//  - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
// Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
//   request.certificate; // error
//           ^^^^^^^^^^^
//
// pkg/front_end/testcases/dartdevc/conditional_import.dart:35:11: Error: The getter 'response' isn't defined for the type 'HttpRequest'.
//  - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
// Try correcting the name to the name of an existing getter, or defining a getter or field named 'response'.
//   request.response; // error
//           ^^^^^^^^
//
// pkg/front_end/testcases/dartdevc/conditional_import.dart:36:11: Error: The getter 'readyState' isn't defined for the type 'HttpRequest'.
//  - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
// Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
//   request.readyState; // error
//           ^^^^^^^^^^
//
import self as self;
import "dart:core" as core;
import "dart:html" as html;

import "dart:html" as a;
import "dart:html" as b;
import "org-dartlang-testcase:///conditional_import.dart" as c;

class HttpRequest extends core::Object {
  synthetic constructor •() → self::HttpRequest
    : super core::Object::•()
    ;
  static synthetic method _#new#tearOff() → self::HttpRequest
    return new self::HttpRequest::•();
}
static method testA(html::HttpRequest request) → dynamic {
  invalid-expression "pkg/front_end/testcases/dartdevc/conditional_import.dart:20:11: Error: The getter 'certificate' isn't defined for the type 'HttpRequest'.
 - 'HttpRequest' is from 'dart:html'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
  request.certificate; // error (from dart:io)
          ^^^^^^^^^^^" in request{<unresolved>}.certificate;
  request.{html::HttpRequest::response}{dynamic};
  request.{html::HttpRequest::readyState}{core::int};
  request.{core::Object::hashCode}{core::int};
}
static method testB(html::HttpRequest request) → dynamic {
  invalid-expression "pkg/front_end/testcases/dartdevc/conditional_import.dart:27:11: Error: The getter 'certificate' isn't defined for the type 'HttpRequest'.
 - 'HttpRequest' is from 'dart:html'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
  request.certificate; // error (from dart:io)
          ^^^^^^^^^^^" in request{<unresolved>}.certificate;
  request.{html::HttpRequest::response}{dynamic};
  request.{html::HttpRequest::readyState}{core::int};
  request.{core::Object::hashCode}{core::int};
}
static method testC(self::HttpRequest request) → dynamic {
  invalid-expression "pkg/front_end/testcases/dartdevc/conditional_import.dart:34:11: Error: The getter 'certificate' isn't defined for the type 'HttpRequest'.
 - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
  request.certificate; // error
          ^^^^^^^^^^^" in request{<unresolved>}.certificate;
  invalid-expression "pkg/front_end/testcases/dartdevc/conditional_import.dart:35:11: Error: The getter 'response' isn't defined for the type 'HttpRequest'.
 - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'response'.
  request.response; // error
          ^^^^^^^^" in request{<unresolved>}.response;
  invalid-expression "pkg/front_end/testcases/dartdevc/conditional_import.dart:36:11: Error: The getter 'readyState' isn't defined for the type 'HttpRequest'.
 - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
  request.readyState; // error
          ^^^^^^^^^^" in request{<unresolved>}.readyState;
  request.{core::Object::hashCode}{core::int};
}
static method main() → void {
  self::expect(false, #C1);
  self::expect(true, #C2);
  self::expect(false, #C1);
}
static method expect(dynamic expected, dynamic actual) → dynamic {
  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
    throw "Expected ${expected}, actual ${actual}";
}

constants  {
  #C1 = false
  #C2 = true
}
